假设有两个接口 Interface1
和 Interface2
,其中Interface2
继承自 Interface1
。
interface Interface1 {
default void method() {
System.out.println("1");
}
// Other methods
}
interface Interface2 extends Interface1 {
@Override
default void method() {
System.out.println("2");
}
// Other methods
}
假设我想创建一个类,实现Interface2
接口,但我希望method()
使用Interface1
中的版本。如果我这样写:
class MyClass implements Interface1, Interface2 {
public void method() {
Interface1.super.method();
}
}
我遇到了编译错误:
默认的超类调用中存在不良类型限定符:冗余接口 Interface1 被 Interface2 继承
可以通过创建第三个接口来解决这个问题:
interface Interface3 extends Interface1 {
default void method() {
Interface1.super.method();
}
}
那么:
class MyClass implements Interface1, Interface2, Interface3 {
public void method() {
Interface3.super.method();
}
}
这段代码可以成功编译,如果我实例化了一个新的MyClass
并调用method()
方法,那么输出结果如预期的一样是1
。
我的问题是,既然轻而易举地绕过了只能在接口链中最具体的接口上写InterfaceName.super.method()
的限制,为什么还要有这个限制?防止哪些问题出现,不允许我们直接写Interface1.super.method()
呢?
Interface2
继承自Interface1
,在哪种情况下你希望一个类同时实现这两个接口呢? - MarounInterface2
,我会得到一个不太有用的错误信息。 - Paul Boddington