Java 8 继承类中具有相同名称的默认方法而不发生任何编译错误
在Java8中,类如何使用相同的默认方法实现两个接口。 我无法从子类中继承的不同接口获得相同默认方法背后的概念。请解释该问题Java 8 继承类中具有相同名称的默认方法而不发生任何编译错误,java-8,Java 8,在Java8中,类如何使用相同的默认方法实现两个接口。 我无法从子类中继承的不同接口获得相同默认方法背后的概念。请解释该问题 interface House { default String getAddress() { return "101 Main Str"; } } interface Bungalow extends House { default String getAddress() { return "101 Smart
interface House {
default String getAddress() {
return "101 Main Str";
}
}
interface Bungalow extends House {
default String getAddress() {
return "101 Smart Str";
}
}
class MyHouse implements Bungalow, House {
}
public class TestClass {
public static void main(String[] args) {
House ci = new MyHouse(); //1
System.out.println(ci.getAddress()); //2
}
}
在上面的代码default
methodgetAddress()
中,存在interface House。在extending interface平房中,另一个同名的方法被声明为default
类MyHouse
如何在没有编译错误的情况下实现这两个接口(因为它不知道在这种情况下实现失败时哪个方法具有首选项)
如果我调用newmyhouse().getAddress()
;给出编译错误,但即使没有从MyHouse类调用方法,它也应该给出编译错误。答案似乎是,这里有一个不同的示例,但有一定的意义,并且非常接近您的示例
在一年半的时间里问我同样的问题,我会说它在编译时会失败,然后告诉我这个答案,这样我就可以再次阅读JLS了。我想这就是他们决定实施的方式。没有想太多,我个人(可能是错的)认为这至少是违反直觉的
Bungalow.getAddress()
覆盖House.getAddress()
。没有编译器错误的原因,在我的机器上,我没有收到编译器错误。@Holger,谢谢,是的,Bungalow在House中重写getAddress,但MyHouse同时实现了House和Bungalow接口,这会导致编译错误,因为它可以访问同名的两个方法。为什么会出现这种例外情况?你说“可以访问同名的两个方法”是什么意思?它继承了两个具有相同名称和类型的方法,如果这两个方法是抽象的,则不会有什么不同。由于这些方法中的一个会覆盖另一个,所以调用哪个方法也很清楚。能否重现OP所说的编译器错误?@Holger否,我假设接口平房
没有扩展编译错误,而扩展
-否。我假设第二个…OP清楚地说“在扩展接口平房”。但是无论如何,当Bungalow
没有扩展House
时,您将在类MyHouse
的声明中得到一个编译错误,但是OP谈论的是新MyHouse().getAddress()
上的编译错误。这两种情况都不会发生。@Holger你是对的,从你的观点来看,再次阅读这篇文章是有意义的。我想我只是把注意力转移开了,因为在尝试之前,我立刻认为它会因编译错误而失败。。。