2017-02-14 227 views
3

在Java中,一個類只能擴展一個父類,但可以實現多個接口。 隨着 引進用Java 8接口缺省方法,有一個類繼承多於一個 方法具有相同簽名的通過實現具有相同的默認方法 這可以創建金剛石問題如在C++Java8中鑽石問題解決或多重繼承的規則

2個接口的可能性

例在下面的代碼

new C().hello(); is 

This is Second

public interface First { 

    default void hello(){ 
     System.out.println("This is First"); 
    } 
} 

public interface Second extends First { 

    default void hello(){ 
     System.out.println("This is Second"); 
    } 
} 

    public class MyClass implements First,Second { 

    public static void main(String[] args) { 
     new MyClass().hello(); 
    } 
} 

什麼是Java使用可熔酚醛樹脂的決議規則的輸出鑽石問題? 一個簡單的答案,比如誰優先,什麼時候會很棒。

+0

想知道很多。偉大你提出這個問題。 –

回答

2

你的代碼片段沒有鑽石問題,因爲接口第二次擴展接口並覆蓋方法hello。

無需擴展接口第二編譯器會引發錯誤

Duplicate default methods named hello with the parameters() and() are inherited from the types Second and First 
2

實現兩個接口是聲明相同的默認方法導致的編譯錯誤:

MyClass inherits unrelated defaults for sayHi() from types InterfaceA and InterfaceB 

所以沒有鑽石的問題;)

要解決此問題,您可以重寫實現類中的方法,並在其中實現它,或者推遲到正確的接口。

在你的情況下,它會看起來像(如果你想使用接口First的方法):

public class MyClass implements First,Second { 
    public void hello() { 
     First.super.hello(); 
    } 
} 
4

有解釋對此進行了詳細相當多的Oracle Tutorial

你基本上已經從第一個接口覆蓋了你的方法,並選擇了最具體的接口方法。

4

以下是當一個類繼承的方法,從多個地方相同的簽名(另一個類或接口)的規律可循:

  • 類總是贏。類或超類 中的方法聲明優先於任何默認方法聲明。
  • 否則,子接口win:選擇在最具體的默認提供接口中具有相同簽名的方法。 (例如在你的第二個接口的情況下,方法應該像第二個接口一樣運行)。
  • 最後,如果選擇仍不明確,則從多個接口繼承的類必須通過覆蓋它並明確調用所需的方法來顯式選擇要使用的默認方法實現。
+0

這正是我所尋找的。一個涵蓋所有場景的非常精確的答案。謝謝!羅希特 –