比方說,有以下幾種類型:的Java 8默認方法繼承
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
被執行,「從富喜」被打印出來。爲什麼Foo
的實施優先? Bar
從Base
繼承sayHi()
,因爲如果MyClass
僅用於執行Bar
,那麼將調用Base
實現?所以代碼仍然不能編譯是有意義的。此外,由於Bar
應有的Base
實施sayHi()
,爲什麼我不能覆蓋它在MyClass
,如:
@Override
public void sayHi() {
Bar.super.sayHi();
}
試圖這樣做時,會出現以下錯誤:
壞類型修飾符在缺省超級調用方法中,sayHi()在Foo中被覆蓋
@Casey什麼IDE您使用的? Eclipse給出了另一個錯誤。 –
@JornVernee這是來自IntelliJ。 Eclipse輸出了什麼? – Casey
@Casey'''非法引用來自類型Base的超級方法sayHi(),無法繞過來自類型Foo''的更具體的覆蓋。 –