由于不希望匹配的类型,无法覆盖子类中的方法

Unable to overwrite method in the subclass because of the undesirably matched type

我有 3 个 类。我想为 myObjStrmyObjInt.

输出“want MyClass”

因此,我只想要子类的方法,想完全替换父类的方法

但目前,我只有 myObjStr.

得到“想要 MyClass”

对于 myObjInt,我错误地将“讨厌 MySuperClass”作为输出(因为 K 在这种情况下不幸匹配 int)。

如果不允许我修改 MySuperClassMyMethod,是否可以修复? MySuperClass 来自标准库,所以我不应该修改它。

Main.java

public class Main {

    public static void main(String[] args) {

        MyClass<String, String> myObjStr = new MyClass<String, String>();
        myObjStr.myMethod("a");
    
        MyClass<Integer, String> myObjInt = new MyClass<Integer, String>();
        myObjInt.myMethod(1);
    
    
    }

}

MySuperClass.java

public class MySuperClass {

    public boolean myMethod(int index) {
        System.out.print("hate MySuperClass, ");
        return false;
    }

}

MyClass.java

public class MyClass<K,V> extends MySuperClass {

    public boolean myMethod(K key) {
        System.out.print("want MyClass, ");
        return false;
    }
}

超级class也应该用泛型参数化:

public class MySuperClass<K> {

    public boolean MyMethod(K index) {
        System.out.print("hate MySuperClass, ");
        return false;
    }

}

并且 subclass 应该使用相同的泛型扩展 super class:

public class MyClass<K,V> extends MySuperClass<K> {

    @Override
    public boolean MyMethod(K key) {
        System.out.print("want MyClass, ");
        return false;
    }
}

编译器发现您正在调用一个名为 MyMethod 的方法,传递类型为 int 的参数并期望 return.

中的 boolean

如果 superclass 的签名不完全是 boolean MyMethod(int)(例如,如果您将其重命名为 MyMethod2),那么编译器不会混淆并会转到subclass 的实现如你所料。

但是,在这种情况下,签名不明确,编译器采用 superclass 而不是 subclass 来获得“更好”的签名匹配。

NIT: the methods names should start with small letter, hence myMethod instead of MyMethod, following the Java standard conventions.


如果您无法修改 MySuperClass 以进行参数化,那么您将不得不在派生的 class:

中显式覆盖 super 方法
public class MyClass<K,V> extends MySuperClass {

    public boolean MyMethod(K key) {
        System.out.print("want MyClass, ");
        return false;
    }

    @Override
    public boolean MyMethod(int index) {
        //Your derived class logic here.
    }
}