多重继承的奇怪行为 - Java 8

Mutilple inheritance strange behavior - Java 8

在下面的代码中,如果我取消注释 I3 并实现 I2I3,则会出现 compilation 失败并出现以下错误:

unrelated defaults for m2() from I3 and I2

这是正常且符合预期的行为。

但是,当我将 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("I3");
//    }
//}

现在我有几个问题:

注:此题与java-8-default-method-inheritance无关

根据默认方法解析规则,将选择最具体的默认提供接口中的默认方法。在您的情况下, I 和 I2 都有一个具有相同签名的默认方法(每个)。因此,它将选择 I2,这是您的 最具体的默认提供接口

另一方面,如果您 implement I2, I3,将会有您需要解决的冲突(通过在您的 class 中实现 m2)。

参考文献:

http://www.lambdafaq.org/how-are-conflicting-method-declarations-resolved/ https://javadevcentral.com/default-method-resolution-rules