Jusqu'à aujourd'hui, je pensais que par exemple :
i += j;
était juste un raccourci pour :
i = i + j;
Mais si on essaie ça :
int i = 5;
long j = 8;
Alors i = i + j;
ne compilera pas mais i += j;
compilera bien.
Cela signifie-t-il qu'en fait i += j;
est un raccourci pour quelque chose comme ceci
i = (type de i) (i + j)
?
Comme toujours avec ces questions, le JLS détient la réponse. Dans ce cas, il s'agit de [§15.26.2 Opérateurs d'assignation composés][1]. Un extrait :
Une expression d'affectation composée de la forme
E1 op= E2
est équivalente àE1 =  ;(T)((E1) op  ;(E2))
, oùT
est le type deE1
, sauf queE1
n'est évalué qu'une seule fois.
Un exemple cité dans [§15.26.2][1]
[...] le code suivant est correct :
court x = 3 ; x += 4.6 ;
et fait en sorte que x ait la valeur 7 car il est équivalent à :
short x = 3 ; x = (short)(x + 4.6) ;
En d'autres termes, votre hypothèse est correcte.
[1] : http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.26.2
Très bonne question. La [spécification du langage Java][1] confirme votre suggestion.
Par exemple, le code suivant est correct :
court x = 3 ; x += 4.6 ;
et aboutit à ce que x ait la valeur 7 car elle est équivalente à :
court x = 3 ; x = (short)(x + 4.6) ;
[1] : http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2
vous devez effectuer un cast de long
vers int
de manière explicite dans le cas de `i = i + l', alors il compilera et donnera une sortie correcte. comme par exemple
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 bien parce que l'opérateur effectue implicitement le casting du type de la variable de droite vers le type de la variable de gauche, donc pas besoin de cast explicite.