java ?: générique - Pourquoi les opérateurs d'assignation composés de Java = +, - =, *, = = / = ne nécessitent-ils pas de transtypage?




5 Answers

Comme toujours avec ces questions, le JLS détient la réponse. Dans ce cas, §15.26.2 Opérateurs d'assignation composée . Un extrait:

Une expression d'affectation composée de la forme E1 op= E2 équivaut à E1 = (T)((E1) op (E2)) , où T est le type de E1 , sauf que E1 n'est évalué qu'une seule fois.

Un exemple cité à partir de §15.26.2

[...] le code suivant est correct:

short x = 3;
x += 4.6;

et donne x avec la valeur 7 car elle est équivalente à:

short x = 3;
x = (short)(x + 4.6);

En d'autres termes, votre hypothèse est correcte.

type variable

Jusqu'à aujourd'hui, je pensais que par exemple:

i += j;

Était juste un raccourci pour:

i = i + j;

Mais si nous essayons ceci:

int i = 5;
long j = 8;

Alors i = i + j; ne compilera pas mais i += j; va compiler bien.

Cela signifie-t-il qu'en fait i += j; est un raccourci pour quelque chose comme ceci i = (type of i) (i + j) ?




Très bonne question. La spécification du langage Java confirme votre suggestion.

Par exemple, le code suivant est correct:

short x = 3;
x += 4.6;

et donne x avec la valeur 7 car elle est équivalente à:

short x = 3;
x = (short)(x + 4.6);



vous devez int explicitly long en int dans le cas où i = i + l alors il compilera et donnera une sortie correcte. comme

i = i + (int)l;

ou

i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.

mais dans le cas de += cela fonctionne simplement car l’opérateur fait implicitement le transtypage de type de type de variable de droite à type de variable de gauche;




En Java, les conversions de type sont effectuées automatiquement lorsque le type de l'expression située à droite d'une opération d'affectation peut être promu en toute sécurité au type de la variable située à gauche de l'affectation. Ainsi, nous pouvons assigner en toute sécurité:

 byte -> short -> int -> long -> float -> double. 

La même chose ne fonctionnera pas dans l'autre sens. Par exemple, nous ne pouvons pas convertir automatiquement un long en un int car le premier nécessite plus de stockage que le second et par conséquent, des informations peuvent être perdues. Pour forcer une telle conversion, nous devons procéder à une conversion explicite.
Type - Conversion




La principale différence est que, avec a = a + b , il n'y a pas de conversion de type, et le compilateur se fâche contre vous pour ne pas avoir transtypé. Mais avec a += b , il s’agit bien de typer b en un type compatible avec a . Donc si tu le fais

int a=5;
long b=10;
a+=b;
System.out.println(a);

Ce que vous faites vraiment, c'est:

int a=5;
long b=10;
a=a+(int)b;
System.out.println(a);



Related