2017-09-26 37 views
8

根據jls-9.4.1.3繼承方法與倍率相當於簽名

如果我繼承的默認方法的簽名是覆蓋等效採用由我繼承另一個方法的接口,則發生 編譯時間錯誤。 (這是其他方法 是否是抽象的或默認的情況下。)

從上面下面的代碼不應該編譯說明。

但是,當我編譯這段代碼時,它的工作非常好。

interface A { 
    void foo(String s); 
} 

interface B<T> extends A { 
    default void foo(T x) { 
    } 
} 

interface C extends B<String> { 
} 

爲什麼編譯?

回答

5

如果一個接口繼承了一個默認方法,它的簽名被覆蓋等價於另一個由I繼承的方法,那麼會發生編譯時錯誤。 (這是其他方法是否是抽象的或默認的情況下。)

的報價是指以下情況:

interface A { 
    void foo(String s); 
} 

interface B<T> { 
    default void foo(T x) { 
    } 
} 

interface C extends A, B<String> {   
} 

其中C都繼承了一個默認的方法和具有相同簽名的另一種方法。

在你給定的情況下B#foo已經覆蓋A#foo,因此C只繼承一個單一的方法。