Почему вы не можете добавить int и a char в некоторых случаях?
Почему
char ch = '4';
ch = '4' + 2;
работает, но
char ch = '4';
ch = ch + 2;
не
Ответ 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, ссылка была любезно предоставлена Джоном Скитом.