4

在我尝试编写以下内容之前,我虽然了解 Java 泛型:

class A{}

class B{
    A a;

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

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

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

谢谢!

4

3 回答 3

10

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

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

SubclassOfA foo = b.<SubclassOfA>getA();

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

一般来说,Java 泛型常见问题解答几乎涵盖了所有内容。

于 2012-08-05T13:03:48.050 回答
2

这是一个应该可以工作的版本:

class B<T extends A>{
    T a;

    T getA(){ 
       return a;
    }
}

客户端代码可以确定 getA() 返回 A 的子类型,就像上面一样,但编译器也可以确定它是正确的 A 子类型

于 2012-08-05T13:05:33.790 回答
-3

T extends A手段T必须是子类A而不是A自身。在你的情况下,你想要类似的东西:

<T> T getA() {
    return a;
}

这是关于 java 泛型的教程

于 2012-08-05T13:06:20.490 回答