20
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:interfaceRnD.DerivedClass 中的 myMethod() 无法覆盖 interfaceRnD.SuperClass 中的 myMethod()
  返回类型 int 与 java.lang.String 不兼容

我应该如何解决这个问题?

4

4 回答 4

23

错误是由于调用myMethod不明确导致的 - 应该调用这两种方法中的哪一种?从JLS §8.4.2

在一个类中声明两个具有重写等效签名的方法是编译时错误。

方法的返回类型不是其签名的一部分,因此根据上述声明,您会收到错误消息。

假设您不能简单地重命名冲突的方法,在这种情况下您不能使用继承,并且需要使用类似组合的替代方法:

class DerivedClass implements MyInterface {

    private SuperClass sc;

    public String myMethod1() {
        return sc.myMethod();
    }

    public int myMethod() {
        return 0;
    }

}
于 2013-06-17T17:07:59.357 回答
13

您不能有两个具有相同签名但返回类型不同的方法。

这是因为编译器无法知道您尝试调用的方法object.myMethod();

于 2013-06-17T17:08:37.307 回答
2

您不能有 2 个具有相同签名但具有不同返回类型的方法。如果可以,则无法确定调用了哪个方法。

顺便说一句,接口中的所有方法都是publicand 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) {...}   
       }  
于 2013-06-17T17:18:39.293 回答
2

方法重载通过它们的参数来区分。这里myMethod()在接口和超类中都有相似的参数签名。所以你不能这样做。

于 2013-06-17T17:10:24.807 回答