如何解決方法聲明之間的衝突?
- 類總是優先的。在類或者子類中的聲明總是優先於所有的默認方法聲明。
- 在有同樣簽名式的方法中選擇最明確提供默認方法的接口。例如,基於這個原則下面的代碼將輸出hello World from B:
public interface A {
default void hello() { System.out.println("Hello World from A"); }
}
public interface B extends A {
default void hello() { System.out.println("Hello World from B"); }
}
public class C implements B, A {
public static void main(String... args) {
new C().hello();
}
}
Class C從類型A和B繼承的沒有關係的默認方法hello()不明確,在A和B中都有方法hello()。
要注意的是上面的錯誤總會出現無論繼承的默認方法是否被調用。衝突必須通過複寫來解決。如果可能的話,繼承的默認方法可以通過這樣的語法來選擇`X.super.m(...)`,x是父接口而m是要選擇的方法:
public class C implements B, A {
public void hello() {
A.super.hello();
}
}
現在這個代碼將輸出`Hello World from A`。注意的是,這個語法僅僅只能夠被用來解決衝突,而不能用來複寫上面列出的兩個原則。