由于不希望匹配的类型,无法覆盖子类中的方法
Unable to overwrite method in the subclass because of the undesirably matched type
我有 3 个 类。我想为 myObjStr
和 myObjInt
.
输出“want MyClass”
因此,我只想要子类的方法,想完全替换父类的方法
但目前,我只有 myObjStr
.
得到“想要 MyClass”
对于 myObjInt
,我错误地将“讨厌 MySuperClass”作为输出(因为 K
在这种情况下不幸匹配 int
)。
如果不允许我修改 MySuperClass
的 MyMethod
,是否可以修复? 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.
}
}
我有 3 个 类。我想为 myObjStr
和 myObjInt
.
因此,我只想要子类的方法,想完全替换父类的方法
但目前,我只有 myObjStr
.
对于 myObjInt
,我错误地将“讨厌 MySuperClass”作为输出(因为 K
在这种情况下不幸匹配 int
)。
如果不允许我修改 MySuperClass
的 MyMethod
,是否可以修复? 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 ofMyMethod
, following the Java standard conventions.
如果您无法修改 MySuperClass
以进行参数化,那么您将不得不在派生的 class:
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.
}
}