Java泛型澄清

时间:2012-08-05 13:01:06

标签: java generics

在我尝试编写以下代码之前,我了解Java泛型:

class A{}

class B{
    A a;

    <T extends A> T getA(){ 
       return a; // does not compile
    }
}

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

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

3 个答案:

答案 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;
}

这是tutorial on java generics