16/06/2010

Questions pièges Java n°5 : réponse

Code :

class AClass {
public static void main() {
Byte B1 = 2;
Byte B2 = 200;
Long L = 2;
Number N = 2;
Object O = 2;
}
}


Réponse
Les trois premières lignes du corps de la fonction main sont incorrectes

Explication
La première ligne est incorrecte car :
- on ne peut pas Boxer un int en Byte, on ne peut que le boxer en Integer
- il n'existe pas de conversion de Byte en Integer
- il n'existe pas d'enchainement de conversion implicite qui commençe par caster un int en byte puis qui le boxe en Byte

Ceci n'a rien à voir avec la valeur contenue dans le Byte. La ligne 4 est donc tout aussi incorrecte.

Cela n'a rien à voir non plus avec le fait que le byte soit plus "étroit" que le int. La ligne 5 est incorrecte pour exactement les mêmes raisons.

Les lignes 6 et 7 sont correctes. Il s'agit d'un enchainement de conversions :
- Boxing (int -> Integer)
- Widening reference (Integer ->Number) ou (Integer -> Object)


Point théorique associé
ici

Commentaires

Bonjour,

Merci pour ces exercices bien sympathique.

En testant la Question piège Java n°5 j'arrive à un autre résultat que celui indiqué dans la réponse.
Chez moi, le code suivant compile et l'autoboxing fonctionne :
Byte B1 = 2;

Meilleures salutations

Écrit par : Sébastien | 26/04/2013

Bonjour,

L'ensemble de ces exercices s'applique à Java 1.5.
Il est possible que le comportement aie changé depuis.
Je n'ai malheureusement pas eu l'occasion de relire la spec depuis.

Avec quelle version avez vous testé ?

Merci

Écrit par : Mathieu | 13/09/2013

Les commentaires sont fermés.