在我尝试编写以下内容之前,我虽然了解 Java 泛型:
class A{}
class B{
A a;
<T extends A> T getA(){
return a; // does not compile
}
}
我收到一个编译错误,说类型不兼容:需要 T,找到 A。
- 为什么我会收到错误消息?
- 我很乐意参考一篇描述这种 Java 泛型陷阱的文章。
谢谢!
如果它编译,它将不是类型安全的:
B b = new B();
b.a = new A();
SubclassOfA foo = b.<SubclassOfA>getA();
编译器不能保证a
它将是 的实例T
,并且由于类型擦除,它甚至无法在执行时检查它 - 所以它不会编译。
一般来说,Java 泛型常见问题解答几乎涵盖了所有内容。
这是一个应该可以工作的版本:
class B<T extends A>{
T a;
T getA(){
return a;
}
}
客户端代码可以确定 getA() 返回 A 的子类型,就像上面一样,但编译器也可以确定它是正确的 A 子类型