继承层次结构对泛型有哪些限制?

时间:2019-01-10 13:29:01

标签: java generics

假设存在类/接口层次结构:

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;
    }
}

我们看到有一个编译器错误。 我从来没有碰到过继承时如何对待泛型的规则。有什么限制? (请不要与泛型类型本身的继承相混淆,我在询问原始类中的继承

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

也不要因为我想修复此错误而感到困惑。当然,B类扩展了A修复它。我的问题是:“我在哪里可以阅读这些限制?”

3 个答案:

答案 0 :(得分:2)

您将必须在类定义中使用T,以便T通配符在AB中都绑定到相同的通用类型,从而解决了冲突:

class B<T> extends A<T>

答案 1 :(得分:2)

您没有延长A的{​​{1}},只是为T引入了一个新的类型参数T。除非您编写B,否则这些T是不同的:

B<T> extends A<T>

class B<T> extends A<T> { @Override T method(T t) { return t; } } 的{​​{1}}和A的{​​{1}}都将被擦除为T,类B将包含2个方法T

  

示例8.4.8.3-4。擦除影响覆盖

     

一个类不能有两个同名类型的成员方法   删除

Object
     

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

阅读:8.4.8.3. Requirements in Overriding and Hiding

答案 2 :(得分:0)

您编译错误就像@ f1sh所说。

关于规则, 它们将具有适用于它们的相同规则。这将包括:

类型的橡皮擦 上,下和无界类型

此外,泛型可以应用于单个方法。何时以及如何使用它们取决于您要做什么。

有关更多信息,https://www.tutorialspoint.com/java/java_generics.htm