[英]Generics - incompatible types
public class HelloWorld{
public static void main(String[] args) {
List<? extends Number> callback = new ArrayList<Long>();
new Container<>().test(callback);
}
public static class Container<T extends Number> {
public void test(List<T> some) {
}
}
}
該代碼產生
HelloWorld.java:7: error: incompatible types: List<CAP#1> cannot be converted to List<Number>
new Container<>().test(callback);
^
where CAP#1 is a fresh type-variable:
CAP#1 extends Number from capture of ? extends Number
您能否詳細說明此代碼不正確。
我希望新的Container將被泛化為與回調兼容的類型
首先,不能存在擴展String
的類型,因為String
是最終類。
其次,編譯器無法確定類型是否為? extends SomeType
? extends SomeType
你用你的List
是相同類型的T extends SomeType
您使用的Container
類,所以它產生一個錯誤。
您需要做的就是在方法簽名中聲明一個泛型類型,然后對List
和Container
使用該類型:
public <T extends SomeClass> void example() {
List<T> callback = new ArrayList<>();
new Container<T>().test(callback);
}
或使用不受限制的類型聲明列表:
List<SomeClass> callback = new ArrayList<>();
new Container<>().test(callback);
好吧,您正在使用泛型。 當您定義Container時,它告訴Container默認構造函數必須支持類型為String的實例。 這是一個正確的示例,其中String是Object的子類,所以我使用它。
public class HelloWorld{
public static void main(String[] args) {
List<String> callback = new ArrayList<String>();
new Container<String>().test(callback);
}
public static class Container<T extends Object> {
public void test(List<T> some) {
}
}
}
我希望這可以幫助你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.