Pourquoi ne pas Java +=, -=, *=, /= composé des opérateurs d'affectation nécessite casting?

Jusqu'à aujourd'hui, j'ai pensé que pour exemple:

i += j;

Était juste un raccourci pour:

i = i + j;

Mais si nous essayons ceci:

int i = 5;
long j = 8;

Puis i = i + j; ne compile pas mais i += j; compiler amende.

Veut-il dire qu'en fait i += j; est un raccourci pour quelque chose comme cela
i = (type of i) (i + j)?

Je suis surpris de Java permet cela, en étant un langage plus stricte que celle de ses prédécesseurs. Les erreurs de casting peut conduire à un échec critique, comme ce fut le cas avec Ariane5 Vol 501 où un 64-bit à virgule flottante en fonte pour un entier 16 bits entraîné dans la chute.
Dans un système de contrôle de vol, écrit en Java, ce serait le cadet de vos soucis @SQLDiver
En fait i+=(long)j; même de compiler amende.
La constante pousser par un ensemble de développeurs pour plus de précision et un autre pour la facilité d'utilisation est vraiment intéressant. On a presque besoin de deux versions de la langue, qui est incroyablement précis et qui est facile à utiliser. Poussant Java à partir de deux directions se déplace vers inapproprié pour les deux groupes.
si elle n'a besoin de la coulée, où placeriez-vous? i += (int) f; jette f avant l'addition, il n'est donc pas équivalent. (int) i += f; convertit le résultat après la cession, ne sont pas équivalentes. il n'y aurait pas de place pour mettre un plâtre qui signifie que vous voulez jeter de la valeur après l'ajout, mais avant la cession.

OriginalL'auteur Honza Brabec | 2012-01-03