J'ai noté une différence dans le comportement de déballage automatique entre Java SE 6 et Java SE 7. Je me demande pourquoi, car je ne trouve aucune documentation sur les changements de ce comportement entre ces deux versions.
Voici un exemple simple:
Object[] objs = new Object[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Cela compile bien avec javac de Java SE 7. Cependant, si je donne au compilateur l'argument "-source 1.6", j'obtiens une erreur sur la dernière ligne:
inconvertible types
found : java.lang.Object
required: int
J'ai essayé de télécharger Java SE 6 pour compiler avec le compilateur natif de la version 6 (sans aucune option -source). Il accepte et donne la même erreur que ci-dessus.
Alors qu'est-ce qui donne? À partir d'un peu plus d'expérimentation, il semble que le déballage dans Java 6 ne peut déballer que des valeurs qui clairement (au moment de la compilation) sont du type encadré. Par exemple, cela fonctionne dans les deux versions:
Integer[] objs = new Integer[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Il semble donc qu'entre Java 6 et 7, la fonctionnalité de déballage a été améliorée afin de pouvoir convertir et déballer des types d'objets en un seul coup, sans savoir (au moment de la compilation) que la valeur est du type encadré approprié. Cependant, en lisant la spécification du langage Java ou les articles de blog qui ont été écrits au moment de la sortie de Java 7, je ne vois aucun changement de cette chose, donc je me demande quel est le changement et comment cette "fonctionnalité" est appelée ?
Juste une curiosité: en raison du changement, il est possible de déclencher de "faux" déballages:
Object[] objs = new Float[2];
objs[0] = new Float(5);
int myInt = (int)objs[0];
Cela compile bien mais donne une exception ClassCastException au moment de l'exécution.
Une référence à ce sujet?
Integer obj = new Integer(2); int x = (int)obj;
: fonctionne sur Java 7, donne une erreur sur Java 6.