2010-09-09 28 views
5

Je comprends que le code suivant ne fonctionnera pasL'autoboxing/élargissement se produit dans Short a = 3 mais pas dans Float a = 3;

Float a=3 

parce que sa traduit par flotteur a = Integer.valueOf (3). Nous aurons une référence Float sur le LHS et un objet Integer sur le RHS, ce qui est incompatible. Mais:

1.

 `Short a=3;` 

Cela fonctionne, mais là encore, nous aurons une référence à court sur le LHS et un objet entier sur la partie droite.

2.

Float a=(Float) 3

Si nous n'avions pas typecasted 3, il aurait été traduit par Integer.valueOf (3). Maintenant, sera-t-il traduit comme Float.valueOf (3)?

+0

Avez-vous un compilateur Java? Si oui, vous pouvez essayer cela. – DJClayworth

Répondre

0

Si vous essayez d'initialiser une variable avec une valeur supérieure à celle qu'elle peut contenir (quelle que soit la forme numérique de la valeur), le compilateur vous donnera un message d'erreur.

char c = 0xffff; // max char hex value 
byte b = 0x7f; // max byte hex value 
short s = 0x7fff; // max short hex value 

Avis dans le code ci-dessus les valeurs maximales possibles hexadécimaux pour char, octet, et court. Si vous les excédez, le compilateur va automatiquement rendre la valeur int et vous dire que vous avez besoin d'une distribution plus étroite pour l'assignation. Vous saurez que vous avez franchi la ligne.

Donc dans votre cas Short s = 3 devient effectivement Short s = new Short(3) et fonctionne. (Méthodes de ValueOf ne sont pas utilisées lorsque Autoboxing c'est pourquoi IDEs modernes ont des options pour signaler ces Autoboxing comme des erreurs et nous pouvons les remplacer par la méthode valueOf pour une meilleure Mgmt de mémoire)

Dans le second cas Float a=(Float) 3 deviendront Float.valueOf(3)

+0

Merci. Très clair. Pouvez-vous confirmer alors, que "Float a = 3 ne fonctionnera pas car Java n'autorise pas l'élargissement suite à un autoboxing". De plus, l'autoboxing ne signifie pas simplement que le constructeur de wrapper approprié est appelé pour le LHS. Si c'était le cas, Float a = 3 aurait fonctionné. Ce qui doit se passer, c'est qu'avant l'autoboxing, une conversion rétrécie doit avoir lieu pour que le type primitif soit le même que le type primitif de l'encapsuleur et que seul l'autoboxage ait lieu. Suis-je ici? – Daud

1

La forme courte est:

Float a=3.0f; 

Pour le type Double:

Double b=3.0; 
2

Si votre question est « Pourquoi Float f = 3, ne compile pas, mais à court s = 3; fait? ", alors la réponse est:

le compilateur Java fait un travail spécial sur les constantes entières pour les ajuster du côté gauche: il trouve le type le plus approprié et l'utilise. Ainsi,

Short s = 3; 

est compilé à

Short s = Short.valueOf(3); 

Essentiellement, la même magie se produit lorsque vous écrivez

short s = 3; 

Mais cela est fait seulement pour Entiers, et non pour les valeurs à virgule flottante .

0

Il n'existe aucun moyen de spécifier des constantes de court et d'octet, de sorte que le compilateur vous permet de translater des constantes int de façon transparente. Il y a des constantes flottantes dans java donc ça ne supporte pas la traduction implicite.Si vous voulez un flotteur/Float, je vous suggère d'utiliser une constante flottante.

Byte b = 3; 
Short s = 3; 
Integer i = 3; 
Long l = 3L; 
Float f = 3f; 
Double d = 3d;