class C <E extends C>{
E inC;
public E doStuff(E e,C<E> e2){
return e.getE();
}
public E getE(){
return inC;
}
}
上面的代码导致编译错误,我不明白为什么 doStuff()方法返回一个&#39; E类型&#39;因为E扩展了C,任何期望C的方法都可以接受E&#39; E&#39;反之亦然,那为什么我会收到错误? 我在OCPJP的模拟测试中看到了这个问题。 在此先感谢您的帮助
答案 0 :(得分:2)
当你说C
时,你犯了一个错误并提到E extends C
而没有给它参数。
如果您将班级定义为
class C<E extends C<E>> {
您的代码将有效。 (遗憾的是,这种习惯在Java中很常见;例如,你说<T extends Comparable<T>>
而不仅仅是<T extends Comparable>
;这是必要的,因为没有办法在签名中引用“这种类型”< / p>
如果没有C<E>
澄清,您只知道e.getE()
生成C
,但不一定是E
- 它可能是不同 C
的子类。那是为什么?
我们知道E
是C<Something>
,但我们不知道Something
是什么。因此e.getE()
是Something
,不是必然是E
。
例如,您允许class A extends C<B> {}
doStuff
返回B
而不是A
- 这就是编译器生气的原因。