Eu escrevi o código:
int x = 18;
x *= 0.90;
System.out.println(x);
Este código impresso16
Contudo, quando escrevi
int x = 18;
x = x * 0.90;
System.out.println(x);
me deu o seguinte erro:incompatible types: possible lossy conversion from double to int
Eu esperava que ambos os exemplos de código resultassem exatamente no mesmo erro que x *= y;
é igual a x = x * y;
, mas x *= 0.90;
de alguma forma funciona e x = x * 0.90;
não funciona. Por que isso acontece?
Porque o Java Language Specifcation (JLS) diz isso. É um pouco estranho, mas, ao usar os operadores de atribuição compostos (
*=
,+=
, etc.), a conversão está implícita.Consulte JLS §15.26.2 , que mostra claramente o elenco no exemplo logo no topo dessa seção.
Por que ele faz isso? Bem, não acho que SO seja o lugar certo para perguntar 'o que os designers estavam pensando há 30 anos, quando esta parte das especificações do JLS foi escrita'. Se eu tivesse que dar uma facada completamente selvagem no escuro, provavelmente seria o mesmo motivo subjacente a quase todas as decisões estranhas de especificação de java lang: "Porque C fez dessa maneira".
Nesse ponto você pode perguntar por que os designers de C fizeram isso dessa maneira. Provavelmente porque B fez assim. Nesse ponto você pode perguntar por que os designers B fizeram isso dessa maneira. Felizmente, existem mais ou menos as mesmas pessoas (Ken Thompson e Dennis Ritchie). Eles ainda estão vivos e têm respectivamente 80 e 70 anos. Até onde eu sei, eles não frequentam o Stack Overflow.