Unterschiede in der auto-unboxing zwischen Java 6 vs Java 7

Habe ich festgestellt, ein Unterschied in der auto-unboxing Verhalten zwischen Java SE 6 und Java SE 7. Ich Frage mich, warum das so ist, denn ich finde keine Dokumentation von änderungen in diesem Verhalten zwischen diesen beiden Versionen.

Hier ein einfaches Beispiel:

Object[] objs = new Object[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];

Diese kompiliert einwandfrei mit javac von Java SE 7. Jedoch, wenn ich den compiler die "source 1.6" argument bekomme ich eine Fehlermeldung in der letzten Zeile:

inconvertible types
found   : java.lang.Object
required: int

Ich habe versucht, das herunterladen von Java SE 6 zum kompilieren mit der nativen version 6-compiler (ohne die option-source). Sie ist einverstanden und gibt die gleiche Fehlermeldung wie oben.

So was gibt? Von einigen, mehr Experimente scheint es, dass das unboxing in Java 6 kann nur unbox Werte, die deutlich (zur compile-Zeit) ist der boxed-Typ. Zum Beispiel, dieses funktioniert in beiden Versionen:

Integer[] objs = new Integer[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];

So scheint es, dass zwischen Java 6 und 7, die unboxing-Funktion wurde verbessert, so dass es wirken könnte und unbox-Objekt-Typen auf einen Streich, ohne zu wissen (zur compile-Zeit), dass der Wert ist der richtige Box Typ. Aber das Lesen durch die Java Language Specification oder blog-posts, die geschrieben wurden, die zur Zeit Java 7 kam raus, ich kann nicht sehen, jede änderung in dieser Sache, so Frage ich mich, was die änderung ist und was dieses "feature" genannt wird?

Nur eine kuriosität: Aufgrund der änderung ist es möglich, die Auslöser für "falsche" unboxings:

Object[] objs = new Float[2];
objs[0] = new Float(5);
int myInt = (int)objs[0];

Diese kompiliert einwandfrei, aber gibt eine classcastexception-Fehler zur Laufzeit.

Jede Bezugnahme auf diese?

  • Interessant. Eine neue Zutat für das autoboxing Durcheinander. Ich denke, dein Beispiel sein könnte mehr einfach und klar mit einem einzigen Objekt statt eines Arrays. Integer obj = new Integer(2); int x = (int)obj; : arbeiten auf Java 7 gibt Fehler, die auf Java 6.
  • Welches JDK benutzt du? Es könnte auch zu tun haben mit verschiedenen Anbietern ...
  • Guter Punkt, um eine Vereinfachung, ich habe es vereinfacht etwas (von meinem original-code), aber irgendwie gestoppt zu früh!
  • Es war die neueste JDK (für jede version) " von Oracle, die ich verwendet.
  • schön Forschung getan.+1.
  • Ein weiterer Grund, um nie verwenden autoboxing.

InformationsquelleAutor Morty | 2013-04-20
Schreibe einen Kommentar