Почему i+=l компилируется, где i - int, а l - long?

Я заметил Java's +=, -=, *=, /= compound assignment operators (хороший вопрос :)), но в нем была часть, которую я не совсем понимаю. Заимствование из того вопроса:

int i = 5;
long l = 8;

Тогда i = i + l; не скомпилируется, а i += l; скомпилируется нормально.

Принятый ответ на связанный вопрос гласит:

Составное выражение присваивания вида E1 op= E2 эквивалентно E1 = (T)((E1) op (E2)), где T - тип E1, за исключением того, что E1 оценивается только один раз.

что дает, что i += l; то же самое, что i = (int)((i) + (l)); за исключением того, что i оценивается только один раз.

Число long может быть (IIRC даже гарантированно) длиннее, чем int, и поэтому может содержать гораздо больший диапазон значений.

Учитывая, что такая ситуация может легко привести к потере данных из-за необходимого сужающего преобразования в какой-то момент во время выполнения оператора (либо оценки выражения r-значения, либо присваивания), почему i += l; не является ошибкой времени компиляции или хотя бы предупреждением?

8
задан Community 23 May 2017 в 11:55
поделиться