这个问题是为了理解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将知道我们所覆盖的接口方法。
对此最好的解释是什么?这种情况有意义吗?
先谢谢
答案 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
因此,在您的情况下,您不能使用相同的方法名称(在您的情况下没有参数)和不同的返回类型。
如果你在一个接口方法中添加一个参数,那么你的代码就会编译。
$
答案 4 :(得分:0)
如果你从一个代码调用Child的实例上的方法一边考虑它:
Child child = new Child();
child.display();
将调用哪种显示方法?看到它可能是任何一种方法,你会看到编译时错误。
Java 8中有趣的方法是在其中一个接口中使用默认方法;这些都有自己的一套规则。