Betrachten Sie das folgende Beispiel-Code:Java Überlastung: Referenz nennen mehrdeutig
public class TestClass {
public void doSth(String str, String l, Object... objects) {
System.out.println("A");
}
public void doSth(String str, Object... objects) {
System.out.println("B");
}
}
Wenn ich jetzt new TestClass().doSth("foo", "bar")
nenne ich das erwartete Ergebnis A
bekommen. Aber wenn ich die Methode Signatur des ersten Verfahrens ändern, indem chaging die Parameter l
auf eine primitive Art:
public class TestClass {
public void doSth(String str, long l, Object... objects) {
System.out.println("A");
}
public void doSth(String str, Object... objects) {
System.out.println("B");
}
}
Aufruf new TestClass().doSth("foo", 2L)
werden ergeben einen reference to call ambiguous
Kompilierung Fehler.
Ich dachte schon seit einiger Zeit darüber nach und konsultierte auch this stackoverflow question, aber ich konnte nicht verstehen, warum das passiert. Meiner Meinung nach ist die doSth("foo", 2L)
spezifischer für die doSth(String string, long l, Object... obj)
Signatur und sollte dem Compiler erlauben, ebenfalls zu dieser Schlussfolgerung zu kommen.
Offensichtlich können Primitive auch Objekte sein? –
@blahfunk, ja, sie können verpackt werden – Andrew
Die einzige Erklärung, die in den Sinn kommt, ist [Autoboxing] (https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html), aber das sollte sein ein Konvertierungsschritt "weiter" entfernt als die primitive Version der Methode. – Turing85