Сдвиг типа char, аналогичные назначения ведут себя по-разному

Привет у меня есть кусок кода Java, который сдвигает символ на 2, как это так

char ch = 'A';
ch += 2;
System.out.println(ch);

Выход в этом случае 'C' (как и ожидалось). Но если я переписываю код следующим образом:

char ch = 'A';
ch = ch + 2;
System.out.println(ch);

Я получаю ошибку компиляции "Несоответствие типов: невозможно преобразовать из int в char". Почему это происходит, не равны ли два приема?

1 ответ

Решение

Это распространенное заблуждение, что X += Y идентично X = X + Y, Из JLS §15.26.2:

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

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

ch = ch + 2;  // no cast, error

тип правой стороны int в то время как тип левой стороны char, поэтому существует несоответствие типов между двумя сторонами присваивания, отсюда и ошибка. Это можно исправить с помощью явного приведения:

ch = (char) (ch + 2);  // cast, no error
Другие вопросы по тегам