Heim >Java >javaLernprogramm >Wie geht Java mit mehreren Schnittstellen mit identischen Methodensignaturen um?
In Java, wenn eine Klasse mehrere Schnittstellen implementiert, die Methoden mit demselben Namen und definieren Signatur stellt sich die Frage: Welche Methode wird überschrieben?
Laut Gemäß der Java Language Specification (JLS) bestimmt der Compiler die zu überschreibende Methode anhand der folgenden Regel:
Geerbte Methoden von mehreren Schnittstellen gelten als „override-äquivalent“. " (JLS 8.4.8.4), wenn sie die gleiche Signatur haben. Daher ist nur eine Methodenimplementierung erforderlich.
Beispiel:
public class Test implementiert A, B { <br> public static void main(String... args) throws Exception{ </p> <p>}</p> <p>@Override<br> public int f() { // von welcher Schnittstelle A oder B</p> <pre class="brush:php;toolbar:false">return 0;
}
}
< ;/pre>
In diesem Code implementiert die Klasse Test die Schnittstellen A und B, die beide eine Methode namens f() mit derselben haben Unterschrift. Da diese Methoden überschreibungsäquivalent sind, spielt es keine Rolle, welche f()-Methode der Schnittstelle von Test.f() überschrieben wird. Es ist nur eine Implementierung erforderlich und der Compiler unterscheidet nicht zwischen den beiden Schnittstellen.
Dieses Verhalten erstreckt sich auch auf die Vererbung und das Ausblenden von Methoden. Wenn eine Schnittstellenmethode mit einer Methode in der Oberklasse oder einer anderen Schnittstelle in Konflikt steht, müssen die in Konflikt stehenden Methoden überschreibungsäquivalent sein, damit der Code gültig ist.
Kompatibilitätsbeispiel :
<br>public interface Gift { void gegenwärtig(); }<br>public interface Guest { void present(); }</p> <p>public class Presentable implementiert Gift, Guest { <br> @Override <br> public void present() {</p> <pre class="brush:php;toolbar:false">System.out.println("Heeeereee's Johnny!!!");
}
}
Hier haben sowohl Gift als auch Guest eine present()-Methode. Die Presentable-Klasse implementiert beide Schnittstellen und stellt eine einzige Implementierung für present() bereit. Der Compiler erkennt, dass diese Methoden Override-äquivalent sind und keine separaten Implementierungen erfordern.
Inkompatibilitätsbeispiel:
public interface Gift { void present(); }<br>public interface Guest { boolean present(); }</p><p>public class Presentable implementiert Gift, Guest { // WIRD NICHT KOMPILIERT!!!<br> // Fehler: Typen Gift und Guest sind inkompatibel<br>}<br>
In diesem Fall sind die Rückgabetypen der present()-Methoden unterschiedlich. Gemäß JLS 8.4.8.3 müssen überschreibende Methoden kompatible Signaturen und Rückgabetypen haben. Da Gift.present() und Guest.present() keine kompatiblen Rückgabetypen haben, wird der Code nicht kompiliert.
Zusammenfassend lässt sich sagen, dass der Compiler dies tun wird, wenn mehrere Schnittstellen mit denselben Methodensignaturen implementiert werden Identifizieren Sie die zu überschreibende Methode als die Methode, die dem Überschreiben entspricht. Dies bedeutet, dass nur eine Methodenimplementierung erforderlich ist, unabhängig davon, welche Schnittstelle die Methode definiert.
Das obige ist der detaillierte Inhalt vonWie geht Java mit mehreren Schnittstellen mit identischen Methodensignaturen um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!