使用类型变量作为泛型类中的返回类型

时间:2018-04-22 08:32:03

标签: generics return-type type-variables

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的模拟测试中看到了这个问题。 在此先感谢您的帮助

1 个答案:

答案 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的子类。那是为什么?

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

例如,您允许class A extends C<B> {} doStuff返回B而不是A - 这就是编译器生气的原因。