接口和继承:“返回类型int不兼容”

时间:2013-06-17 17:04:27

标签: java inheritance interface

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

我该如何解决这个问题?

4 个答案:

答案 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界面中的所有方法都是publicabstract

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) {...}   
       }