[英]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.