Составные операторы присваивания определяются JLS ( 15.26.2 ) следующим образом:
"Составное выражение присваивания в форме E1 op= E2
равноэквивалентно
E1 = (T)((E1) op (E2))`,
, где T - это тип E1, за исключением того, что E1 оценивается только один раз. "
В этом случае E1 имеет тип int
E2 имеет тип long
, а op +
.Так что это эквивалентно:
value = (int)(value + increment);
Добавление int
и long
дает long
, который затем возвращается к int
перед назначением.Все в порядке, следовательно, нет ошибки компиляции.
Разница между этим и простым присваиванием (то есть value = value + increment;
) заключается в том, что простое присваивание не имеет тип-трансляции.
Ладно, так почему они определили это таким образом?
Я думаю, что причина в том, чтобы сделать примеры, подобные этой:
byte b = ...
b += 1;
Без Typecast, b += 1
будет ошибкой компиляции, и вам нужно записать ее как:
b += (byte) 1;