两个接口具有相同的方法名称和不同的返回类型

时间:2015-07-22 12:09:46

标签: java oop

这个问题是为了理解Java中的接口。 这是一个用Java实现接口的一个非常简单的例子。

interface ParentA {
    void display();
}

interface ParentB {
    int display();
}

class Child implements ParentA, ParentB {
    @Override
    public void display() {
        System.err.println("Child ParentA");
    }
    //ERROR : The return type is incompatible with ParentB.display()

    //So added method with int return type too
    @Override
    public int display() {
        System.err.println("Child ParentB");
    }
}

这种情况可能发生在大型Java应用程序中,其中两个接口可以具有相同名称的方法。 我认为,由于返回类型不同,JVM将知道我们所覆盖的接口方法。

对此最好的解释是什么?这种情况有意义吗?

先谢谢

5 个答案:

答案 0 :(得分:3)

因为不允许使用具有相同签名的方法,所以它会混淆编译器以从声明的一次中检测确切的 override-equivalent 方法。

  

JLS (§8.4.2)

  两个方法或构造函数M和N具有相同的签名(如果它们)   有,

     
      
  • 同名
  •   
  • 相同的类型参数(如果有)(§8.4.4)和
  •   
  • 在将形式参数类型N调整为类型之后   M的参数,相同的形式参数类型。
  •   
     

在类中使用 override-equivalent 签名声明两个方法是编译时错误。

答案 1 :(得分:3)

如果你发现自己处于这种情况并且无法以更干净的方式解决,你可以有一个或两个内部类来转发对新命名方法的调用:

Child

现在回顾从ParentA parentA = child.asParentA(); ParentB parentB = child.asParentB(); 到你必须做的界面:

{{1}}

答案 2 :(得分:1)

在同一个类中不可能有两个具有相同签名和不同返回类型的方法。

签名的定义:

  

方法名称和参数列表的组合。

这是因为jvm两者不可能选择仅与返回类型不同的方法。 jvm infact只能调查方法的名称和调用的参数类型。

所以你的例子在java中是不可能的。

可能你必须创建两个类,一个用于接口。

答案 3 :(得分:1)

要实现覆盖,您将破坏重载规则。

The conditions for method overloading

  1. 方法的参数数量不同。
  2. 参数类型不同(比如更改参数) 是一个浮动到int)。
  3. 因此,在您的情况下,您不能使用相同的方法名称(在您的情况下没有参数)和不同的返回类型。

    如果你在一个接口方法中添加一个参数,那么你的代码就会编译。

    $

答案 4 :(得分:0)

如果你从一个代码调用Child的实例上的方法一边考虑它:

Child child = new Child();
child.display();

将调用哪种显示方法?看到它可能是任何一种方法,你会看到编译时错误。

Java 8中有趣的方法是在其中一个接口中使用默认方法;这些都有自己的一套规则。