class C <E extends C>{
E inC;
public E doStuff(E e,C<E> e2){
return e.getE();
}
public E getE(){
return inC;
}
}
上面的代码会导致编译器错误,我不明白为什么。 doStuff() 方法返回一个 'E 类型' ,因为 E 扩展了 C,任何期望 C 的方法都可以接受 'E' ,反之亦然,那么为什么我会收到错误? 我在OCPJP的模拟测试中看到了这个问题。 预先感谢您的帮助
最佳答案
您犯了一个错误并提到了 C
当你说 E extends C
时,没有给它参数.
如果您将类定义为
class C<E extends C<E>> {
你的代码可以工作。 (不幸的是,这种习惯用法在 Java 中很常见;例如,您说 <T extends Comparable<T>>
而不仅仅是 <T extends Comparable>
;这是必要的,因为没有办法在签名中引用“这种类型”)
没有C<E>
澄清一下,你只知道e.getE()
产生 C
,但不一定是E
-- 它可能是 C
的不同子类。这是为什么?
我们知道 E
是 C<Something>
,但我们不知道什么 Something
是。所以e.getE()
是 Something
,不一定是 E
。
例如,您允许 class A extends C<B> {}
谁的doStuff
返回 B
而不是A
-- 这就是编译器生气的原因。
关于generics - 在泛型类中使用类型变量作为返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49964020/