Я заметил 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;
не является ошибкой времени компиляции или хотя бы предупреждением?