2012-12-15 4 views
3

Voici ce code:conversion implicite de type primitif à objet

int[] someArray = {0, 1, 2, 3}; 
//System.out.println(someArray[0].toString()); int cannot be dereferenced 
// creating Object element with use of primitive element fails 
//Object newObject = new Object(someArray[0]); constructor Object in class java.lang.Object cannot be applied to given types; 
for(Object someObject : someArray) 
{ 
    // here int is casted to Object 
    System.out.println(someObject.toString()); // prints 0, 1, 2, 3 
} 

Comment se fait-il que la variable de type primitif (élément de tableau) ne peut pas être explicitement casté en objet, mais en quelque sorte dans la boucle for cet élément primitif est casté à Object?

+0

Question intéressante. Ma conjecture est que la boucle foreach améliorée pour les tableaux fonctionne en créant une sorte de classe d'itérateur interne qui encadre le type primitif donné. C'est à dire. vous n'êtes pas en train d'itérer directement sur le tableau, mais sur un Iterator caché . – millimoose

+3

Vous ne diffusez aucun contenu dans vos commentaires. 'int x = 5; System.out.println (((Object) x)); 'fonctionnera certainement correctement, même sans boucle. –

+0

@ThomasJungblut Le fait est que la boucle foreach ne fait généralement pas ce genre de casting pour vous non plus. – millimoose

Répondre

5

Depuis 1.5, le compilateur Java automatiquement boîte et Unbox types primitifs lorsque le contexte l'exige. (En d'autres termes, un int est enveloppé dans un objet Integer et vice versa.) Cela se produit lorsque attribue entre une primitive et une variable d'objet. (. Ou une coulée primitive à un type d'objet) Ainsi, par exemple, le code suivant est valide:

int i = 123; 
Object o = i; 

va de même pour l'affectation implicite Object someInt = someArray[…] que le compilateur émet pour la boucle foreach. La raison pour laquelle someArray[0].toString() ne fonctionne pas, c'est que vous n'attribuez pas someArray[0] à une variable typée objet ou que vous faites quoi que ce soit d'autre qui dirait au compilateur d'autobox - essayer d'appeler une méthode sur une primitive simplement n'est pas reconnu comme l'une des conditions lorsque cela devrait se produire.

Questions connexes