我正在做一个尝试,尝试以这种方式覆盖泛型类的方法:
public class MyGenFun<T extends CharSequence> extends Do<String>{
public void doX(T s){
System.out.println("in CHILD");
}
public static void main (String ...a){
MyGenFun<String> x = new MyGenFun<>();
x.doX("Test"); /// LINE 1
}
}
class Do<A>{
public void doX(A a){
System.out.println("in Super");
}
}
为什么我不能?编译错误是
yGenFun.java:15:错误:对doX的引用不明确,Do中的doX(A)方法和MyGenFun中的doX(T)方法都匹配x.doX(“ Test”); ^其中A,T是类型变量:A扩展在类Do中声明的Object T扩展了在类MyGenFun中声明的CharSequence 1错误
如果我注释“第1行”,则可以编译代码。所以我认为我正确地压倒了一切。
这是因为您实际上并没有覆盖该方法,而只是重载了它。要覆盖,所有参数类型必须匹配。所以正确的覆盖方法是
public void doX(String s) {
}
T
是扩展CharSequence的东西,可能是String
但不一定是String
,例如也可以CharBuffer
。
您实例化以下内容:
MyGenFun<String> x = new MyGenFun<>();
因此,因为您不是在重写此方法而是在重载它,所以在当前上下文中现在有两种具有相同签名的方法,一种来自子类,一种来自超类:
public void doX(String a) {
...
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句