在泛型 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。这是为什么?

我们知道EC<Something>,但不知道Something是什么。所以 e.getE()Something 而不是 必然是 E

例如,您允许 class A extends C<B> {}doStuff returns 为 B 而不是 A —— 这就是编译器疯了。