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
,因为这是 A
和 B
的约定],它确实如此,因为 B
提供了默认实现。
但是编译器不同意我的说法,说:
C is not abstract and does not override abstract method method()
我完全可以在其他类似情况下看到问题,例如 this one,但我无法弄清楚这段代码有什么问题。
从语法的角度来看可能没有错,但问题是:从接口B有一个默认方法,覆盖另一个不相关的接口A的抽象方法是否有意义?
想象一下,这两个接口代表两种不同的计算值的方式:一种允许返回 null
值,另一种则不允许。如果第一个接口的默认方法返回 null
,那将违反第二个接口的约定。如果编译器允许它在 class C 中被继承,那么 class C 实际上违反了其中一个已实现接口的约定,可能导致程序员没有注意的错误。
请注意,如果 B 是 class 而不是接口,则编译时没有问题,因为在这种情况下不存在“混合契约”问题,因为只有一个接口。
我在使用默认方法时偶然发现了一个奇怪的问题。
考虑这种情况:
interface A {
int method();
}
interface B {
default int method() {
return 1;
}
}
class C implements A, B {
void anotherMethod() { }
}
我希望 class C
可以按原样进行:它应该实现 method
,因为这是 A
和 B
的约定],它确实如此,因为 B
提供了默认实现。
但是编译器不同意我的说法,说:
C is not abstract and does not override abstract method method()
我完全可以在其他类似情况下看到问题,例如 this one,但我无法弄清楚这段代码有什么问题。
从语法的角度来看可能没有错,但问题是:从接口B有一个默认方法,覆盖另一个不相关的接口A的抽象方法是否有意义?
想象一下,这两个接口代表两种不同的计算值的方式:一种允许返回 null
值,另一种则不允许。如果第一个接口的默认方法返回 null
,那将违反第二个接口的约定。如果编译器允许它在 class C 中被继承,那么 class C 实际上违反了其中一个已实现接口的约定,可能导致程序员没有注意的错误。
请注意,如果 B 是 class 而不是接口,则编译时没有问题,因为在这种情况下不存在“混合契约”问题,因为只有一个接口。