假设存在以下类型:
public interface Base {
default void sayHi(){
System.out.println("hi from base");
}
}
public interface Foo extends Base {
@Override
default void sayHi(){
System.out.println("hi from foo");
}
}
public interface Bar extends Base {
}
public class MyClass implements Foo, Bar {
public static void main(String[] args) {
MyClass c = new MyClass();
c.sayHi();
}
}
在这种情况下,如果执行
main
,将会打印出 "hi from foo"。为什么 Foo
的实现会优先?Bar
不是继承自 Base
的 sayHi()
吗?因此,如果 MyClass
只实现了 Bar
,那么会调用 Base
的实现。所以代码依然不能编译也说得通。另外,既然 Bar
应该有 Base
的 sayHi()
实现,为什么我不能在 MyClass
中覆盖它呢:@Override
public void sayHi() {
Bar.super.sayHi();
}
尝试执行操作时,出现以下错误:
在默认的超类调用方法中出现了错误类型限定符“Bar”,表示方法 sayHi() 在 Foo 中被覆盖
从类型Base到更具体的类型Foo,无法绕过重写的sayHi()方法,因此对超类方法sayHi()的非法引用
- Jorn Verneebad type qualifier Bar in default super call Bar.super.sayHi(); method sayHi() is overridden in Foo
的错误信息。 - blacktide