提问者:小点点

多重遗传奇怪行为-Java 8


在以下代码中,如果取消对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无关


  • 共1个答案

    匿名用户

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

    另一方面,如果您实现了I2,i3,则会出现需要解决的冲突(通过在类中实现M2)。

    参考资料:

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