2017-09-26 16 views
8

Według jls-9.4.1.3Dziedziczenie metody równoważne z zastępują podpisów

Jeśli interfejs i dziedziczy sposób domyślny, którego podpis jest zastąpić równoważne z innej metody dziedziczone przez I, a następnie pojawia się błąd czasu kompilacji . (Jest tak w przypadku, gdy inna metoda jest abstrakcyjna lub domyślna.)

Z powyższego opisu następujący kod nie powinien się kompilować.

Jednak, gdy skompiluję ten kod, jego działanie będzie absolutnie w porządku.

interface A { 
    void foo(String s); 
} 

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

interface C extends B<String> { 
} 

Dlaczego to się kompiluje?

Odpowiedz

5

Jeśli interfejs I dziedziczy domyślną metodę, której sygnaturę zastępuje odpowiednik innej metody odziedziczonej przez I, pojawia się błąd podczas kompilacji. (Jest to przypadek, czy inna metoda jest abstrakcyjna lub domyślna.)

Cytat odnosi się do następującej sytuacji:

interface A { 
    void foo(String s); 
} 

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

interface C extends A, B<String> {   
} 

gdzie C zarówno dziedziczy metodę domyślną i inny sposób z tym samym podpisem .

W danej sytuacji B#foo już przesłoniła A#foo, a zatem C dziedziczy tylko jedną metodę.

Powiązane problemy