声明一个类是否为泛型为什么会影响该类的其他泛型方法(与该类上的泛型参数不同)
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作者由于某种原因有意为之,还是编译器的推断能力不足.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这个是泛型的边界问题,java编译器不允许不安全的类型转换。
第一个方法参数定义了 Foo<?>,告诉了编译器,类的泛型允许接受任何类型,因此可以进行安全的类型转换(其实是接受OBJECT)
第二个方法没有指定Foo的泛型类型,因此这里会存在类型转换的不确定性。