Java 8 wprowadza domyślne metody zapewniające możliwość rozszerzenia interfejsów bez potrzeby modyfikowania istniejących implementacji.
Zastanawiam się, czy możliwe jest jawne wywołanie domyślnej implementacji metody, gdy metoda ta została zastąpiona lub nie jest dostępna z powodu sprzecznych domyślnych implementacji w różnych interfejsach.
interface A {
default void foo() {
System.out.println("A.foo");
}
}
class B implements A {
@Override
public void foo() {
System.out.println("B.foo");
}
public void afoo() {
// how to invoke A.foo() here?
}
}
Biorąc pod uwagę powyższy kod, jak byś zadzwonił A.foo()
z metody klasy B?
Odpowiedzi:
Zgodnie z tym artykułem dostęp domyślnej metody w interfejsie
A
za pomocąTo może być wykorzystywane w następujący sposób (zakładając, interfejsy
A
iC
oba mają metody domyślnefoo()
)A
iC
mogą mieć zarówno.foo()
metody, jak i wybraną konkretną domyślną implementację lub możesz użyć jednej (lub obu) jako części nowejfoo()
metody. Możesz także użyć tej samej składni, aby uzyskać dostęp do wersji domyślnych innymi metodami w klasie implementującej.Formalny opis składni wywołania metody można znaleźć w rozdziale 15 JLS .
źródło
A extends SomeOtherInterface
iSomeOtherInterface
madefault Type method()
, to nie możesz po prostu zadzwonićSomeOtherInterface.super.method()
z ChildClass. Można dzwonić tylko domyślne metody interfejsów wymienionych wChildClass
'simplements
klauzuli, a nie ich interfejsów dominujących metod.super.super.someMethod();
(bo to byłoby okropne)Poniższy kod powinien działać.
Wynik:
źródło
Ta odpowiedź jest napisana głównie dla użytkowników, którzy pochodzą z pytania 45047550, które jest zamknięte.
Interfejsy Java 8 wprowadzają niektóre aspekty wielokrotnego dziedziczenia. Metody domyślne mają zaimplementowaną treść funkcji. Aby wywołać metodę z superklasy, możesz użyć słowa kluczowego
super
, ale jeśli chcesz to zrobić za pomocą super interfejsu, musisz jawnie nazwać ją.Wynik:
źródło
Nie musisz zastępować domyślnej metody interfejsu. Po prostu nazwij to tak:
Wynik:
źródło