Мой коллега задал мне этот вопрос, и я немного смущен.
int i = 123456;
short x = 12;
Утверждение
x += i;
Компиляция отлично, однако
x = x + i;
не
Что здесь делает Java?
Ответ 1
int i = 123456;
short x = 12;
x += i;
на самом деле
int i = 123456;
short x = 12;
x = (short)(x + i);
В то время как x = x + i просто x = x + i. Он автоматически не отображается как short и, следовательно, вызывает ошибку (x + i имеет тип int).
Совокупное выражение выражения формы E1 op= E2 эквивалентно E1 = (T)((E1) op (E2)), где T - тип E1, за исключением того, что E1 оценивается только один раз.
Числа рассматриваются как int, если вы специально их не применяете. Таким образом, во втором выражении, когда вы используете буквенное число вместо переменной, оно автоматически не передает его соответствующему типу.
x = x + (short)1;
... должен работать.
Ответ 3
Оператор + интегральных типов (int, short, char и byte) всегда возвращает результат int.
Вы можете видеть, что с помощью этого кода:
//char x = 0;
//short x = 0;
//byte x = 0;
int x = 0;
x = x + x;
Он не будет компилироваться, если x не является int.