Ich bereite mich auf eine SCJP-Prüfung vor, und wenn ich den verbreiterten Teil studiere, wird gesagt, dass die Erweiterung Boxing und Var-args bei der Überladung schlägt, aber es gibt keine klare Erklärung. Versuchte Suche, aber bekam keine bessere Antwort.
Eine Antwort ist, dass der Compiler den älteren Stil auswählt, bevor er den neueren Stil auswählt. Aber ich bin nicht überzeugt.
Edit: Ich weiß, Erweiterung ist lieber als Boxen und Var-Args. aber WARUM ist meine Frage. von denen ich einen kenne. andere Gründe.
Ja, der Compiler wählt aufgrund der Kompatibilitätsanforderungen den älteren Stil gegenüber dem neueren Stil. Stellen Sie sich einen Code vor, der geschrieben wurde, bevor Java 5 herauskam, der plötzlich eine Änderung des Verhaltens hatte, wenn er unter Java 5 kompiliert wurde! Das wäre schlecht.
Seit der Einführung von Java gibt es immer mehr Konvertierungen, aber Autoboxing und Varargs sind neu in Java 5.
Hier ist ein Beispiel dafür:
%Vor%Das bedeutet also, dass es sich vor dem Autoboxing und der Verwendung von Varargs verbreitern wird. Wenn wir die Methode des Erweiterns mit dem langen Parameter herausnehmen würden, hätte sie das Autoboxing vor den Varargs gewählt.
Der Compiler muss mit früheren Versionen von Java kompatibel bleiben. Darüber hinaus wählt der Compiler die performanteste / kleinste Änderung an dem Argument. Förderung eines anderen primitiven Beats, das ein Wrapper-Objekt erzeugt und das das Erstellen eines Arrays in Bezug auf Speichernutzung und -leistung übertrifft.
Der Grund dafür, dass die Erweiterung besser ist, liegt darin, dass es eine einfache Operation ist, Extend zu signieren, eine einzelne Anweisung für die meisten CPUs. Boxing erfordert eine Heap-Zuweisung, und boxed Objekte sind teurer zu erreichen, erfordern mindestens einen zusätzlichen Speicherzugriff.
Auch ohne das Kompatibilitätsproblem scheint mir, dass die Sprache zuerst die schnellste Überladung bevorzugen sollte, solange dieses Verhalten keine schlimmeren Probleme verursacht.
Ich weiß nicht wie es euch geht, aber ich würde lieber meinen byte
als int
als Byte
übergeben. Berücksichtigen Sie den Aufwand. Und Varargs erfordert auch Boxen.
Mit anderen Worten, der Grund ist Effizienz. Das Sprachdesign bevorzugt den effizienteren Aufrufmechanismus, bei dem kein eingerahmtes Element zugewiesen werden muss.
'Benötigt', fragst du? Die varargs-Funktionen erwarten ein Array von Object
, das keinen primitiven Typ enthalten kann.
Kompatibilität ist auch kein schlechter Grund.
erweitert Beats Boxen, Boxen schlägt Generika, Generika schlagen Varargs
oben zu lösen, bedenken Sie dies:
Erweiterung Beats Boxen, Boxen Beats Varargs
Der Ausgang wird sein In lang konvertiert: 3
Tags und Links java