Autoboxing / élargissement se produit dans un court = 3, mais pas dans un flotteur = 3;

StackOverflow https://stackoverflow.com/questions/3676629

  •  01-10-2019
  •  | 
  •  

Question

Je comprends que le code suivant ne fonctionnera pas

Float a=3

parce que son flotteur traduit par un = Integer.valueOf (3). Nous aurons une référence flottante sur la LHS et un objet entier sur la partie droite, 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, il va être traduit comme Float.valueOf (3)?

Était-ce utile?

La solution

Si vous essayez d'initialiser une variable avec une valeur plus grande qu'elle ne 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 hexadécimaux maximales possibles pour char, octet, et court. Si vous dépassez ces derniers, le compilateur fera automatiquement la valeur d'un int et vous dire que vous avez besoin d'un casting de rétrécissement pour l'affectation. Vous saurez que vous avez franchi la ligne.

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

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

Autres conseils

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

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

Short s = 3;

est compilé à

Short s = Short.valueOf(3);

Pour l'essentiel, 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.

La forme courte est:

Float a=3.0f;

Pour le type Double:

Double b=3.0;

Il n'y a aucun moyen de spécifier des constantes à court et octet, de sorte que le compilateur vous permet de traduire des constantes int transparence. Il y a des constantes flottantes en Java afin qu'il 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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top