Até hoje, eu pensava que, por exemplo:
i += j;
Foi apenas um atalho para:
i = i + j;
Mas se tentarmos isto:
int i = 5;
long j = 8;
Então i = i + j;
não irá compilar, mas i += j;
irá compilar bem.
Significa que de facto i += j;
é um atalho para algo como isto
i = (tipo de i) (i + j)`?
Como sempre com estas perguntas, a JLS tem a resposta. Neste caso §15.26.2 Operadores de Atribuição Compostos. Um extrato:
Uma expressão de atribuição composta do formulário
E1 op= E2
é equivalente aE1 = (T)((E1) op (E2))
, ondeT
é o tipo deE1
, exceto queE1
é avaliado apenas uma vez.
Um exemplo citado de §15.26.2.
[...] o seguinte código está correcto:
curto x = 3; x += 4.6;
e resulta em x ter o valor 7 porque é equivalente a:
curto x = 3; x = (curto)(x + 4,6);
Em outras palavras, sua suposição é correta.
Muito boa pergunta. A especificação da linguagem Java confirma a sua sugestão.
Por exemplo, o seguinte código está correcto:
curto x = 3; x += 4.6;
e resulta em x ter o valor 7 porque é equivalente a:
curto x = 3; x = (curto)(x + 4,6);
você precisa lançar de long
a int
explícitono caso de
i = i + l` então ele irá compilar e dar a saída correta, como
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.
mas no caso de +=
apenas funciona bem porque o operador implicitamente faz o tipo de fundição do tipo de variável direita para o tipo de variável esquerda, portanto não precisa de fundir explicitamente.