Ho notato una differenza nel comportamento di unboxing automatico tra Java SE 6 e Java SE 7. Mi chiedo perché ciò sia, perché non riesco a trovare alcuna documentazione delle modifiche in questo comportamento tra queste due versioni.
Ecco un semplice esempio:
Object[] objs = new Object[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Questo si compila bene con javac da Java SE 7. Tuttavia, se do al compilatore l'argomento "-source 1.6" ottengo un errore nell'ultima riga:
inconvertible types
found : java.lang.Object
required: int
Ho provato a scaricare Java SE 6 per compilare con il compilatore versione 6 nativa (senza alcuna opzione -source). Accetta e restituisce lo stesso errore di cui sopra.
Allora cosa succede? Da qualche ulteriore sperimentazione sembra che l'unboxing in Java 6 possa solo unboxing di valori che chiaramente (in fase di compilazione) è del tipo boxed. Ad esempio, funziona in entrambe le versioni:
Integer[] objs = new Integer[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Quindi sembra che tra Java 6 e 7, la funzione di unboxing sia stata migliorata in modo che potesse lanciare e decomprimere i tipi di oggetti in un colpo solo, senza sapere (in fase di compilazione) che il valore è del tipo boxed corretto. Tuttavia, leggendo le specifiche del linguaggio Java o i post sul blog scritti al momento in cui è uscito Java 7, non riesco a vedere alcun cambiamento di questa cosa, quindi mi chiedo quale sia il cambiamento e come si chiama questa "funzionalità" ?
Solo una curiosità: a causa del cambiamento, è possibile attivare unboxing "sbagliato":
Object[] objs = new Float[2];
objs[0] = new Float(5);
int myInt = (int)objs[0];
Questo si compila bene ma fornisce un'eccezione ClassCastException in fase di esecuzione.
Qualche riferimento su questo?
Integer obj = new Integer(2); int x = (int)obj;
: funziona su Java 7, dà errore su Java 6.