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可以使用与回调
兼容的类型进行推广答案 0 :(得分:1)
首先,由于String
是最终类,因此不能存在扩展String
的类型。
其次,编译器无法确定您用于? 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);
答案 1 :(得分:1)
嗯,你正在使用泛型。当你定义Container时,它告诉Container默认构造函数必须支持一个String实例的类型。 这是一个正确的例子,String是Object的subClass,所以我使用它。
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) {
}
}
}
我希望这会对你有所帮助。