В моем шоке получается, что следующий код будет компилироваться без каких-либо предупреждений:
public void test()
{
int value = 2000000000;
long increment = 1000000000;
value += increment;
}
В то время как это дает ошибку времени компиляции, как и следовало ожидать:
public void test()
{
int value = 2000000000;
long increment = 1000000000;
value = value + increment;
}
Я проверил это и действительно, JLS (раздел 15.26.2) имеет это, чтобы сказать:
Совокупное присваивание выражения вида E1 op = E2 эквивалентно E1 = (T) ((E1) op (E2)), где T - тип E1, за исключением того, что E1 оценивается только один раз.
Это кажется мне смешным. Почему они чувствовали необходимость явно бросить здесь? Кажется, что автоматическое преобразование типов будет обрабатывать расширение в любом случае, и автоматическое сужение, как это, в значительной степени гарантированно приведет к переполнению целых чисел.