Betrachten Sie den folgenden Java-Code:
public class MoneyCalc {</p> <p>public void method(Object o) {</p> <pre class="brush:php;toolbar:false"> System.out.println("Object Verion");
}
public void method(String s) {
System.out.println("String Version");
}
public static void main(String args[]) {
MoneyCalc question = new MoneyCalc(); question.method(null);
}
}
Hier die überladene Methode Bei der Übergabe eines Nullwerts als Parameter wird die Methode „method(String s)“ ausgewählt. Dies mag kontraintuitiv erscheinen, da null nicht explizit als String-Variable deklariert wird.
Trotz des Namens „Objektversion“ ist die Die Überladung von „method(Object o)“ ist nicht auf Objekte beschränkt. In Java kann null in einen Ausdruck eines beliebigen Klassentyps, einschließlich String, konvertiert werden. Daher gilt folgende Zuordnung:
String x = null;<br>
Der Java-Compiler wählt die spezifischste Überladung gemäß Abschnitt 15.12.2.5 der Java Language Specification (JLS). Informell ist eine Methode spezifischer, wenn von ihr verarbeitete Aufrufe auch von einer anderen Methode ohne Typfehler bei der Kompilierung verarbeitet werden könnten.
In diesem Fall ist die Überladung „method(String s)“ spezifischer, weil Es kann Aufrufe mit String-Argumenten verarbeiten. Die Überladung „method(Object o)“ hingegen kann jeden Objekttyp verarbeiten, einschließlich Null. Aufrufe mit String-Argumenten können jedoch nicht ohne Umwandlung verarbeitet werden, was zu einem Fehler bei der Kompilierung führen würde.
Wenn wir Wenn wir den Code so ändern, dass er eine zusätzliche Überladung „method(StringBuffer sb)“ enthält, tritt ein mehrdeutiger Überladungsfehler auf:
public class MoneyCalc {</p> <p>public void method(StringBuffer sb) {</p> <pre class="brush:php;toolbar:false"> System.out.println("StringBuffer Verion");
}
public void method(String s) {
System.out.println("String Version");
}
public static void main(String args[] ) {
MoneyCalc question = new MoneyCalc(); question.method(null);
}
}
Dies liegt daran, dass weder die „Methode(StringBuffer sb)“ noch die „Methode(String s)“ „Überlastung ist spezifischer als die andere. Beide können Nullargumente verarbeiten und keiner kann den Argumenttyp des anderen ohne Umwandlung verarbeiten.
Das obige ist der detaillierte Inhalt vonWarum wählt die überladene Methodenauswahl von Java „method(String s)“ aus, wenn „null“ übergeben wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!