public interface MyInterface{
public int myMethod();
}
public class SuperClass {
public String myMethod(){
return "Super Class";
}
}
public class DerivedClass extends SuperClass implements MyInterface {
public String myMethod() {...} // this line doesn't compile
public int myMethod() {...} // this is also unable to compile
}
当我尝试编译DerivedClass
时,它会给我错误
java: myMethod() in interfaceRnD.DerivedClass cannot override myMethod() in interfaceRnD.SuperClass return type int is not compatible with java.lang.String
我该如何解决这个问题?
答案 0 :(得分:22)
错误的结果是对myMethod
的调用不明确 - 应该调用哪两种方法?来自JLS §8.4.2:
在类中声明两个具有覆盖等效签名的方法是编译时错误。
方法的返回类型不是其签名的一部分,因此您将根据上述语句收到错误。
假设您不能简单地重命名冲突的方法,在这种情况下您不能使用继承,并且需要使用像composition这样的替代方法:
class DerivedClass implements MyInterface {
private SuperClass sc;
public String myMethod1() {
return sc.myMethod();
}
public int myMethod() {
return 0;
}
}
答案 1 :(得分:12)
您不能拥有两个具有相同签名但返回类型不同的方法。
这是因为当您执行object.myMethod();
时,编译器无法知道您尝试调用的方法。
答案 2 :(得分:1)
方法重载由它们的参数区分。这里,接口和超类中的myMethod()
具有相似的参数签名。所以你不能这样做。
答案 3 :(得分:1)
您不能拥有2个具有相同签名但具有不同返回类型的方法。如果它可能是无法确定的方法被调用。
BTW界面中的所有方法都是public
和abstract
。
public interface MyInterface{
int myMethod();
}
你可以做的是有一个带输入参数的接口,这叫做overloading
示例:
public interface MyInterface{
String myMethod(String param);
}
and in your class
public class DerivedClass extends SuperClass implements MyInterface{
public String myMethod(){ ...}
public String myMethod(String param) {...}
}