Java, почему операторы +=, -=, *= и /= не требует использования кастинга?

До сегодняшнего дня я думал, что, например:

i += j;

было обычным сокращением операции:

i = i + j;

Но если мы попробуем это:

int i = 1;
long j = 2;
i = i + j; 

Тогда попытка присвоения i правой части выражения выдаёт ошибку.

Означает ли это, что на самом деле i += j; является сокращением для i = (int) (i + j)?

На этот вопрос ответ может дать Java Language Specification:

A compound assignment expression of the form E1 op= E2 is equivalent to E1 = (T) ((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once.

For example, the following code is correct:

  short x = 3;
  x += 4.6;`

and results in x having the value 7 because it is equivalent to:

  short x = 3;
  x = (short)(x + 4.6);

At run time, the expression is evaluated in one of two ways.

Это говорит о том, что Вы правы и на самом деле i += j; является сокращением для i = (int) (i + j).

1 Симпатия