在我尝试编写以下代码之前,我了解Java泛型:
class A{}
class B{
A a;
<T extends A> T getA(){
return a; // does not compile
}
}
我收到编译错误,说明类型不兼容:需要T,找到A。
谢谢!
答案 0 :(得分:10)
如果编译,它将不是类型安全的:
B b = new B();
b.a = new A();
SubclassOfA foo = b.<SubclassOfA>getA();
编译器无法保证a
将成为T
的实例,并且由于类型擦除,它甚至无法在执行时检查它 - 因此它将无法编译。
一般来说,Java Generics FAQ几乎涵盖了所有内容。
答案 1 :(得分:2)
这是一个应该有效的版本:
class B<T extends A>{
T a;
T getA(){
return a;
}
}
客户端代码可以确保getA()返回A的子类型,如上所述,但编译器也可以确定它是A的正确子类型
答案 2 :(得分:-3)
T extends A
表示T
必须是A
的子类,而不是A
本身的子类。在你的情况下,你想要像:
<T> T getA() {
return a;
}