Especificação de linguagem Java define E1 op= E2
como equivalente a E1 = (T) ((E1) op (E2))
onde T
é um tipo de E1
e E1
é avaliada uma vez .
Essa é uma resposta técnica, mas você pode estar se perguntando por que esse é o caso. Bem, vamos considerar o seguinte programa.
public class PlusEquals {
public static void main(String[] args) {
byte a = 1;
byte b = 2;
a = a + b;
System.out.println(a);
}
}
O que esse programa imprime?
Você adivinhou 3? Pena que este programa não será compilado. Por quê? Bem, acontece que a adição de bytes em Java é definida para retornar umint
. Acredito que isso ocorreu porque a Java Virtual Machine não define operações de byte para economizar em bytecodes (há um número limitado delas, afinal), usar operações inteiras é um detalhe de implementação exposto em uma linguagem.
Mas se a = a + b
não funcionar, isso significaria a += b
que nunca funcionaria para bytes se E1 += E2
fosse definido E1 = E1 + E2
. Como mostra o exemplo anterior, esse seria realmente o caso. Como um truque para fazer o +=
operador trabalhar para bytes e curtos, há uma conversão implícita envolvida. Não é tão bom assim, mas, durante o trabalho do Java 1.0, o foco estava em liberar a linguagem para começar. Agora, devido à compatibilidade com versões anteriores, esse hack introduzido no Java 1.0 não pôde ser removido.