Почему 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
Ответы
Ответ 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);