Ich habe einen Unterschied im Verhalten beim automatischen Entpacken zwischen Java SE 6 und Java SE 7 festgestellt. Ich frage mich, warum dies so ist, da ich keine Dokumentation zu Änderungen in diesem Verhalten zwischen diesen beiden Versionen finden kann.
Hier ist ein einfaches Beispiel:
Object[] objs = new Object[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Dies lässt sich gut mit Javac aus Java SE 7 kompilieren. Wenn ich dem Compiler jedoch das Argument "-source 1.6" gebe, wird in der letzten Zeile ein Fehler angezeigt:
inconvertible types
found : java.lang.Object
required: int
Ich habe versucht, Java SE 6 herunterzuladen, um es mit dem nativen Compiler der Version 6 zu kompilieren (ohne die Option -source). Es stimmt zu und gibt den gleichen Fehler wie oben.
Also, was gibt es? Aus einigen weiteren Experimenten geht hervor, dass das Unboxing in Java 6 nur Werte entpacken kann, die eindeutig (zur Kompilierungszeit) vom Typ Boxed sind. Dies funktioniert beispielsweise in beiden Versionen:
Integer[] objs = new Integer[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Es scheint also, dass zwischen Java 6 und 7 die Unboxing-Funktion so erweitert wurde, dass Objekttypen auf einen Schlag umgewandelt und entpackt werden können, ohne (zur Kompilierungszeit) zu wissen, dass der Wert vom richtigen Box-Typ ist. Beim Lesen der Java-Sprachspezifikation oder der Blog-Beiträge, die zum Zeitpunkt der Veröffentlichung von Java 7 geschrieben wurden, kann ich jedoch keine Änderung dieser Sache feststellen. Daher frage ich mich, wie die Änderung lautet und wie diese "Funktion" heißt ?
Nur eine Kuriosität: Aufgrund der Änderung ist es möglich, "falsche" Unboxings auszulösen:
Object[] objs = new Float[2];
objs[0] = new Float(5);
int myInt = (int)objs[0];
Dies lässt sich gut kompilieren, gibt jedoch zur Laufzeit eine ClassCastException aus.
Irgendein Hinweis dazu?
Integer obj = new Integer(2); int x = (int)obj;
: funktioniert auf Java 7, gibt Fehler auf Java 6.