Подтвердить что ты не робот

Почему вы не можете добавить int и a char в некоторых случаях?

Почему

char ch = '4';
ch = '4' + 2;

работает, но

char ch = '4';
ch = ch  + 2;

не

4b9b3361

Ответ 1

Чтобы понять это, рассмотрим, что делает компилятор на каждом шаге для обеих возможностей. Начнем с:

ch = '4' + 2;

Компилятор преобразует '4' в int. Таким образом, он становится

ch = 52 + 2;

Затем компилятор превращается в

ch = 54;

ch - это char, и компилятору разрешено преобразовывать 54 в char, поскольку это может доказать, что нет потери в преобразовании.

Теперь рассмотрим вторую версию:

ch = ch  + 2;

ch не имеет значения во время компиляции. Таким образом, это становится

ch = ((int) ch) + 2;

Теперь компилятор не может доказать, что результат этого (int) сохраняется в пределах диапазона char. Таким образом, он будет не автоматически сужать его и сообщает об этом как ошибку.

EDIT1:

Если компилятор может доказать, что переменная никогда не будет изменяться и будет inlineable. Тогда вторая форма может быть преобразована в первую. Субир отметил, что добавление "final" делает это возможным. Хотя, если компилятор должен был выполнить анализ изменений, то он технически способен вычислить это без финального ключевого слова, но окончательное облегчает компилятор и считыватели кода.

EDIT2:

Ограничение int до char описано в Java Language Spec, ссылка была любезно предоставлена ​​Джоном Скитом.