Java: Почему нет (int) + = (double) вызывает ошибку "несовместимых типов"?

Здесь странность:

float a = 0;
a = a + Math.PI; // ERROR

и еще:

a += Math.PI; // OK!

даже это работает:

int b = 0;
b += Math.PI; // OK, too!

Почему оператор += допускает преобразования неявного типа с потерями?

Ответ 1

От JLS §15.26.2:

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

Обратите внимание, что существует листинг, связанный с назначением соединения. Однако при простом добавлении нет отливки, следовательно, ошибка.

Если включить литье, ошибка будет предотвращена:

float a = 0;
a = (float) (a + Math.PI);  // works

Это распространенное заблуждение, что x += y идентично x = x + y.

Ответ 2

Это потому, что

float a = 0;
double b = 1;
a += b;

является эквивалентом

float a = 0;
double b = 1;
a = (float)(a + b);

a += совпадает с a = (<type of a>)(a +