Class 从两个不同的接口和一个默认实现继承相同的方法将无法编译

Class inheriting same method from two different interfaces and a single default implementation won't compile

我在使用默认方法时偶然发现了一个奇怪的问题。

考虑这种情况:

interface A {
    int method();
}
interface B {
    default int method() {
        return 1;
    }
}
class C implements A, B {
    void anotherMethod() { }
}

我希望 class C 可以按原样进行:它应该实现 method,因为这是 AB 的约定],它确实如此,因为 B 提供了默认实现。

但是编译器不同意我的说法,说:

C is not abstract and does not override abstract method method()

我完全可以在其他类似情况下看到问题,例如 this one,但我无法弄清楚这段代码有什么问题。

从语法的角度来看可能没有错,但问题是:从接口B有一个默认方法,覆盖另一个不相关的接口A的抽象方法是否有意义?

想象一下,这两个接口代表两种不同的计算值的方式:一种允许返回 null 值,另一种则不允许。如果第一个接口的默认方法返回 null,那将违反第二个接口的约定。如果编译器允许它在 class C 中被继承,那么 class C 实际上违反了其中一个已实现接口的约定,可能导致程序员没有注意的错误。

请注意,如果 B 是 class 而不是接口,则编译时没有问题,因为在这种情况下不存在“混合契约”问题,因为只有一个接口。