Сдвиг типа 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