在泛型 class 中使用类型变量作为 return 类型
Using type variable as a return type in a generic class
class C <E extends C>{
E inC;
public E doStuff(E e,C<E> e2){
return e.getE();
}
public E getE(){
return inC;
}
}
上面的代码导致编译出错,我没看懂why.The
doStuff() 方法 returns a 'E type' ,因为 E 扩展了 C,任何期望 C 的方法都可以接受 'E' ,反之亦然,那么为什么我会得到错误?
我在一次OCPJP的模拟考试中看到了这个问题。
在此先感谢您的帮助
你犯了一个错误,当你说 E extends C
时没有给它参数就提到了 C
。
如果您将 class 定义为
class C<E extends C<E>> {
您的代码可以正常工作。 (不幸的是,这种成语在 Java 中很常见;例如,您说 <T extends Comparable<T>>
而不仅仅是 <T extends Comparable>
;这是必要的,因为没有办法引用 "this type"在签名中)
没有 C<E>
的说明,您只知道 e.getE()
产生了 C
,但不一定是 E
-- 它可能是 [=42= C
的不同 子class。这是为什么?
我们知道E
是C<Something>
,但不知道Something
是什么。所以 e.getE()
是 Something
, 而不是 必然是 E
。
例如,您允许 class A extends C<B> {}
其 doStuff
returns 为 B
而不是 A
—— 这就是编译器疯了。
class C <E extends C>{
E inC;
public E doStuff(E e,C<E> e2){
return e.getE();
}
public E getE(){
return inC;
}
}
上面的代码导致编译出错,我没看懂why.The doStuff() 方法 returns a 'E type' ,因为 E 扩展了 C,任何期望 C 的方法都可以接受 'E' ,反之亦然,那么为什么我会得到错误? 我在一次OCPJP的模拟考试中看到了这个问题。 在此先感谢您的帮助
你犯了一个错误,当你说 E extends C
时没有给它参数就提到了 C
。
如果您将 class 定义为
class C<E extends C<E>> {
您的代码可以正常工作。 (不幸的是,这种成语在 Java 中很常见;例如,您说 <T extends Comparable<T>>
而不仅仅是 <T extends Comparable>
;这是必要的,因为没有办法引用 "this type"在签名中)
没有 C<E>
的说明,您只知道 e.getE()
产生了 C
,但不一定是 E
-- 它可能是 [=42= C
的不同 子class。这是为什么?
我们知道E
是C<Something>
,但不知道Something
是什么。所以 e.getE()
是 Something
, 而不是 必然是 E
。
例如,您允许 class A extends C<B> {}
其 doStuff
returns 为 B
而不是 A
—— 这就是编译器疯了。