In der akzeptierten besten Antwort auf diese Frage gibt es eine klare Erklärung, warum Boxen passiert.
Wenn ich jedoch den Code dekompiliere (mit Java Decompiler), kann ich scala.runtime.BoxesRunTime nicht verwenden. Außerdem, wenn ich den Code profile (mit JProfiler) kann ich keine Instanzen von BoxesRunTime sehen.
Also, wie sehe ich wirklich einen Beweis für das Boxen / Unboxing?
In diesem Code:
%Vor% Der Aufruf von bar
sollte zuerst die ganze Zahl einkisten. Kompilieren Sie mit Scala 2.8.1 und verwenden Sie:
, um den Bytecode zu sehen, der für die Methode main
der Klasse Main
erzeugt wurde:
Sie können den Aufruf von BoxesRunTime
vor dem Aufruf von bar
sehen.
BoxesRunTime
ist ein Objekt, das Box-Methoden für primitive Typen enthält. Es sollte also genau eine Instanz geben. Der Trick dabei ist, dass diese bestimmte Datei in der Bibliothek in Java geschrieben wurde und die Konvertierungen statische Methoden sind. Aus diesem Grund gibt es zur Laufzeit keine Instanzen davon, obwohl es sich in Scala-Code anfühlt, als ob es ein Objekt wäre.
Sie sollten wahrscheinlich nach Boxed-Primitiven (z. B. java.lang.Integer) mit JProfile suchen, obwohl ich nicht sicher bin, wie die JVM funktioniert und ob sie den Code möglicherweise zur Laufzeit neu schreibt und ihn optimiert, um ein Boxing zu vermeiden. Meines Wissens sollte es keine Spezialisierung geben (aber ich glaube, dass CLR das tut). Ein paar Microbenchmarks mit und ohne Boxsituation sind eine andere Möglichkeit herauszufinden, was zur Laufzeit passiert.
BEARBEITEN:
Das obige geht davon aus, dass ein Typparameter nicht mit der Annotation @specialized
annotiert wurde. In diesem Fall kann das Boxen / Unboxing vermieden werden. Bestimmte Klassen in der Standardbibliothek sind spezialisiert. Siehe diese Seite .
Gegeben das folgende Test.scala-Programm:
%Vor% Wenn ich mit scalac -Xprint:jvm Test.scala
kompiliere, bekomme ich dieses Snippet, was darauf hindeutet, dass eine Spezialisierung stattfindet (sorry für wide paste):
Könnte sein, dass Sie keinen Beweis für das Boxen in Bytecode sehen ...