Java通用类方法重写

比斯科尼西尼(G Bisconcini)

我正在做一个尝试,尝试以这种方式覆盖泛型类的方法:

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行”,则可以编译代码。所以我认为我正确地压倒了一切。

beosign

这是因为您实际上没有覆盖该方法,而只是重载了它。要覆盖,所有参数类型必须匹配。所以正确的覆盖方法是

public void doX(String s) {       
}

T是扩展CharSequence的东西,可能是String但不一定是String,例如也可以CharBuffer

您实例化以下内容:

MyGenFun<String> x = new MyGenFun<>();

因此,因为您不是在重写此方法而是在重载它,所以在当前上下文中现在有两种具有相同签名的方法,一种来自子类,一种来自超类:

public void doX(String a) {
...
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章