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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie es aussieht ist die Sprache, in Abschnitt 5.5 Casting Conversion von Java 7 JLS wurde aktualisiert und im Vergleich zu der gleiche Abschnitt in der Java 5/6 JLS, wahrscheinlich um zu klären, erlaubt Konvertierungen.
Java 7 JLS sagt
Java 5/6:
Java 7 JLS enthält auch eine Tabelle (Tabelle 5.1) der zulässigen Umwandlungen (diese Tabelle ist nicht enthalten in der Java 5/6 JLS) aus Referenz-Typen primitive. Diese explizit-Listen wirft von Objekt-primitiven als eine Verengung Referenz-Konvertierung mit unboxing.
Der Grund erklärt ist,diese E-Mail:
Du hast Recht, einfacher gesagt:
Dies funktioniert in Java 7, sondern bietet eine Zusammenstellung Fehler in Java 6 und unten. Seltsam, dieses feature ist nicht prominent dokumentiert; es ist zum Beispiel nicht erwähnt hier. Es ist fraglich, ob es ein neues feature oder ein bug-fix (oder ein neuer bug?), sehen Sie einige - Informationen und Diskussion. Der Konsens scheint zu zeigen, um eine Mehrdeutigkeit in der original spec, das führte zu einer leicht falsche/inkonsistente Implementierung auf Java 5/6, wurde behoben, die 7, denn es war ausschlaggebend für die Implementierung der JSR 292 (Dynamisch Typisierten Sprachen).
Java autoboxing hat jetzt etwas mehr fallen und überraschungen. Zum Beispiel
kompiliert wird, aber nicht (mit
ClassCastException
) zur Laufzeit. Diese, stattdessen, funktioniert:long x = (long)(int)obj;