继承层次结构对泛型有什么限制



假设有类/接口层次结构:

class A<T>{
    T method(T t){
        return t;
    }
}
class B<T> extends A{
    T method(T t){ // method(T)' in 'B' clashes with 'method(T)' in 'A'; both methods have same erasure, yet neither overrides the other
        return t;
    }
}

正如我们所看到的,有一个编译器错误。我从未遇到过如何在继承时处理泛型的规则。有哪些限制?(请不要与继承混淆 IN 泛型类型本身,我问的是原始类中的继承

也不要与"什么是原始类型"混淆,我知道原始类型,在这个问题上我想弄清楚继承的规则是什么)

也不要混淆,认为我想修复此错误。当然,B类扩展A修复它。我的问题是关于:"我在哪里可以阅读限制?

您必须

在类定义中使用T,以便T通配符在AB中绑定到相同的泛型类型,解决冲突:

class B<T> extends A<T>

你没有延长AT,你只是为B引入了一个新的类型参数T。除非您B<T> extends A<T>写,否则这些T是不同的:

class B<T> extends A<T> {
    @Override
    T method(T t) {
        return t;
    }
}

ATBT都会被擦除以Object,类B将包含2个方法Object method(Object t)

例 8.4.8.3-4.擦除影响覆盖

一个类不能有两个具有相同名称和类型的成员方法 擦除

class C<T> {
    T id (T x) {...}
} 
class D extends C<String> {
    Object id(Object x) {...}
}

https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#d5e14416

阅读:8.4.8.3。覆盖和隐藏中的要求

你编译错误就像@f1sh所说的那样。

现在关于规则,他们将对它们应用相同的规则。这将包括:

文字橡皮擦上限、下限和无界类型

此外,泛型可以应用于单个方法。使用它们的方式和时间取决于您要执行的操作。

欲了解更多信息 https://www.tutorialspoint.com/java/java_generics.htm

最新更新