假设存在类/接口层次结构:
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修复它。我的问题是:“我在哪里可以阅读这些限制?”
答案 0 :(得分:2)
您将必须在类定义中使用T
,以便T
通配符在A
和B
中都绑定到相同的通用类型,从而解决了冲突:
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
答案 2 :(得分:0)
您编译错误就像@ f1sh所说。
关于规则, 它们将具有适用于它们的相同规则。这将包括:
类型的橡皮擦 上,下和无界类型
此外,泛型可以应用于单个方法。何时以及如何使用它们取决于您要做什么。
有关更多信息,https://www.tutorialspoint.com/java/java_generics.htm