Java泛型澄清

Vit*_*liy 4 java generics

在那里,我虽然理解了Java泛型,但在我尝试编写以下代码之前:

class A{}

class B{
    A a;

    <T extends A> T getA(){ 
       return a; // does not compile
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到一个编译错误,说类型不兼容:需要T,找到A.

  1. 为什么我收到错误?
  2. 我很乐意参考一篇描述这种java泛型陷阱的文章.

谢谢!

Jon*_*eet 10

如果编译,它将不是类型安全的:

B b = new B();
b.a = new A();

SubclassOfA foo = b.<SubclassOfA>getA();
Run Code Online (Sandbox Code Playgroud)

编译器不能保证a它将是一个实例T,并且由于类型擦除它甚至无法在执行时检查它 - 所以它不会编译.

一般来说,Java Generics FAQ几乎涵盖了所有内容.