Добавление int к короткому

Мой коллега задал мне этот вопрос, и я немного смущен.

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 оценивается только один раз.

- JLS §15.26.2

Ответ 2

Числа рассматриваются как 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.