Warum erweitert sich beim Überladen einer Methode Boxing und Var-Arrows?

7

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.

    
GuruKulki 24.01.2010, 17:43
quelle

7 Antworten

15

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.

    
Chris Jester-Young 24.01.2010, 17:50
quelle
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.

    
mangoDrunk 24.01.2010 17:53
quelle
1

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.

    
rsp 24.01.2010 18:01
quelle
0

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.

    
ergosys 24.01.2010 18:11
quelle
0

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.

    
bmargulies 24.01.2010 17:46
quelle
0

erweitert Beats Boxen, Boxen schlägt Generika, Generika schlagen Varargs

    
Dmitriy Kochergin 26.08.2010 06:08
quelle
-1
%Vor%

oben zu lösen, bedenken Sie dies:

Erweiterung Beats Boxen, Boxen Beats Varargs

Der Ausgang wird sein In lang konvertiert: 3

    
Vijay Bhaskar Semwal 11.07.2011 06:05
quelle

Tags und Links