Java 8 继承类中具有相同名称的默认方法而不发生任何编译错误

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

在Java8中,类如何使用相同的默认方法实现两个接口。 我无法从子类中继承的不同接口获得相同默认方法背后的概念。请解释该问题

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
method
getAddress()
中,存在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你是对的,从你的观点来看,再次阅读这篇文章是有意义的。我想我只是把注意力转移开了,因为在尝试之前,我立刻认为它会因编译错误而失败。。。