In Java 8 werden Standardmethoden eingeführt , mit denen Schnittstellen erweitert werden können, ohne dass vorhandene Implementierungen geändert werden müssen.
Ich frage mich, ob es möglich ist, die Standardimplementierung einer Methode explizit aufzurufen, wenn diese Methode überschrieben wurde oder aufgrund widersprüchlicher Standardimplementierungen in verschiedenen Schnittstellen nicht verfügbar ist.
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?
}
}
Wie würden Sie unter Berücksichtigung des obigen Codes A.foo()
eine Methode der Klasse B aufrufen ?
Antworten:
Gemäß diesem Artikel gelangen Sie Standardmethode in der Schnittstelle
A
mitDies kann wie folgt verwendet werden (vorausgesetzt, Schnittstellen
A
undC
beide haben Standardmethodenfoo()
)A
undC
können beide.foo()
Methoden haben und die spezifische Standardimplementierung kann ausgewählt werden oder Sie können eine (oder beide) als Teil Ihrer neuenfoo()
Methode verwenden. Sie können dieselbe Syntax auch verwenden, um auf die Standardversionen in anderen Methoden Ihrer Implementierungsklasse zuzugreifen.Eine formale Beschreibung der Syntax des Methodenaufrufs finden Sie in Kapitel 15 des JLS .
quelle
A extends SomeOtherInterface
undSomeOtherInterface
habendefault Type method()
, nicht einfachSomeOtherInterface.super.method()
von ChildClass aus anrufen können. Sie können nur Standardmethoden für Schnittstellen aufrufen, die in der KlauselChildClass
's aufgeführtimplements
sind, nicht die Methoden der übergeordneten Schnittstellen.super.super.someMethod();
(weil das schrecklich wäre)Der folgende Code sollte funktionieren.
Ausgabe:
quelle
Diese Antwort richtet sich hauptsächlich an Benutzer, die aus der geschlossenen Frage 45047550 kommen .
Java 8-Schnittstellen führen einige Aspekte der Mehrfachvererbung ein. Standardmethoden haben einen implementierten Funktionskörper. Um eine Methode aus der Superklasse aufzurufen, können Sie das Schlüsselwort verwenden
super
. Wenn Sie dies jedoch mit einer Superschnittstelle erstellen möchten, müssen Sie diese explizit benennen.Ausgabe:
quelle
Sie müssen die Standardmethode einer Schnittstelle nicht überschreiben. Nennen Sie es einfach wie folgt:
Ausgabe:
quelle