假设有类/接口层次结构:
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
通配符在A
和B
中绑定到相同的泛型类型,解决冲突:
class B<T> extends A<T>
你没有延长A
的T
,你只是为B
引入了一个新的类型参数T
。除非您B<T> extends A<T>
写,否则这些T
是不同的:
class B<T> extends A<T> {
@Override
T method(T t) {
return t;
}
}
A
的T
和B
的T
都会被擦除以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