generics - 在泛型类中使用类型变量作为返回类型

标签 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() 方法返回一个 '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不同子类。这是为什么?

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

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

关于generics - 在泛型类中使用类型变量作为返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49964020/

相关文章:

haskell - Haskell中作为类型变量的高级类型

generics - F# 使用类型变量调用内联函数

c# - 为什么此错误表明我的类没有实现此接口(interface)方法?

c# - 父/子泛型关系

java - 泛型定义内的原始类型

c++ - 模板化使用无法选择模板函数以用作 Visual Studio 中的参数

Haskell GADT 'Show' - 实例类型变量推导

WPF 设计器在解析具有覆盖属性的通用控件时存在错误

c - 为什么在 C 语言中 main() 前面没有数据类型(例如 void、int、char),而在其他语言中却如此?

c - 如何在 C 中返回静态分配的二维数组?