在以下代码中,如果取消对i3
的注释,则会出现编译
失败,错误如下:
来自I3和I2的m2()的无关默认值
这也是我们期望的良好行为。
但是,当我将i3
替换为I
时,它将成功编译,并且我将得到i2
作为输出。
public class DefaultMethodTest implements I, I2 {
public static void main(String[] args) {
DefaultMethodTest obj = new DefaultMethodTest();
obj.m2();
}
}
interface I {
default void m2() {
System.out.println("I1");
}
}
interface I2 extends I {
default void m2() {
System.out.println("I2");
}
}
//interface I3 extends I {
//
// default void m2() {
// System.out.println("I2");
// }
//}
现在我有几个问题:
>
为什么两个接口都有相同的默认方法m2
,在第二种情况下却没有编译
失败?
为什么i2
优先于i
?。
注意:这个问题与java-8-default-method-inheritage无关
根据默认方法解析规则,选择最具体的默认提供界面中的默认方法。 在您的示例中,I和I2都有一个具有相同签名的默认方法(每个)。 因此,它将选择I2,这是您最具体的默认提供接口。
另一方面,如果您实现了I2,i3
,则会出现需要解决的冲突(通过在类中实现M2
)。
参考资料:
http://www.lambdafaq.org/how-are-conflicting-method-declarations-resolved/https://javadevcentral.com/default-method-resolve-rules