Подтвердить что ты не робот

Почему Java использует неявное преобразование типа от двойного до целого при использовании оператора "плюс равно"?

Возможный дубликат:
Изменчивое поведение для возможной потери точности

Пример кода A

 public class Test {                                                         
     public static void main(String[] args) {
         int i = 0;
         i = i + 1.5;
     }
 }

Пример кода B

 public class Test {                                                         
     public static void main(String[] args) {
         int i = 0;
         i += 1.5;
     }
 }

Неудивительно, что компиляция A вызывает ошибку ниже. Удивительно, компиляция B не производит ошибок и, похоже, ведет себя так, как если бы я ввел явное преобразование в целое число до двойного значения 1.5. Почему в мире это происходит? Это противоречит всему, что я думал, что знаю!

Test.java:6: possible

 loss of precision

    found   : double
    required: int
            i = i + 1.5;
                  ^
    1 error
4b9b3361

Ответ 1

Он работает как сконструированный.. Составные операторы добавляют неявное преобразование в операцию. В противном случае вы должны использовать явное приведение.

Дополнительная информация?

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2

Ответ 2

В соответствии с спецификацией языка Java, раздел 15.26.2:

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

short x = 3;
x += 4.6;

и приводит к тому, что x имеет значение 7, потому что оно эквивалентно:

short x = 3;
x = (short)(x + 4.6);