JDK8,代码如下:public class Foo<E> { public <T extends List> T get(T list) { return null;
} public void pass(Foo<?> foo) {
ArrayList arrayList = foo.get(new ArrayList());
} public void broken(Foo foo) { // 编译器报错 Incompatible types,无法转化为ArrayList
ArrayList arrayList = foo.get(new ArrayList());
}
}Foo的泛型参数E和get方法的泛型参数T不同,按理来说是否声明Foo为泛型应该不影响get方法啊.这是JAVA作者由于某种原因有意为之,还是编译器的推断能力不足.
1 回答

倚天杖
TA贡献1828条经验 获得超3个赞
这个是泛型的边界问题,java编译器不允许不安全的类型转换。
第一个方法参数定义了 Foo<?>,告诉了编译器,类的泛型允许接受任何类型,因此可以进行安全的类型转换(其实是接受OBJECT)
第二个方法没有指定Foo的泛型类型,因此这里会存在类型转换的不确定性。
添加回答
举报
0/150
提交
取消