Конечные символы в Java
В следующем сегменте кода возникает ошибка времени компиляции.
char c = 'c';
char d = c + 5;
Ошибка во второй строке говорит,
possible loss of precision
required: char
found: int
Сообщение об ошибке основано на среде IDE NetBeans.
Если этот символ c
объявлен final
следующим образом.
final char c = 'c';
char d = c + 5;
Ошибка времени компилятора.
Он не имеет отношения к случаю окончательных строк
Что делает модификатор final
здесь?
Ответы
Ответ 1
Причина в том, что JLS # 5.2 (Преобразование присваивания) говорит так:
Если выражение является константным выражением (§15.28) типа byte, short, char или int, то сужение примитивного преобразования может быть использовано, если тип переменной является байтом, коротким или char, и значение константного выражения представляется в типе переменной.
В вашем примере char c = 'c';
не константа, но final char c = 'c';
есть.
Обоснование, вероятно, заключается в том, что оператор сложения +
сначала преобразует свои операнды в целые числа. Таким образом, операция может переполняться, если все не является постоянным, и в этом случае компилятор может доказать, что переполнения нет.
Ответ 2
Когда вы применяете оператор +
к целым типам
Двоичное числовое продвижение выполняется в операндах (§5.6.2).
В этом случае значения char
повышаются до значений int
.
Здесь
char c = 'c';
char d = c + 5;
потому что c
не является постоянным выражением, компилятор не может определить, сможет ли значение c + 5
, которое является int
, соответствовать char
.
В этом
final char c = 'c';
char d = c + 5;
где c
- постоянное выражение, компилятор может определить, что значение c
, которое 99
, добавлено в 5
, которое 104
действительно подходит в char
. Из-за этой гарантии Java может безопасно выполнять суживающее преобразование от int
до char
.
Если вместо этого вы имели
final char a = Character.MAX_VALUE;
char b = (a + 5);
вы увидите аналогичное поведение, как и ваш первый тестовый пример, поскольку значение a + 5
не подходит для char
. Компилятор определяет, что значение int
, полученное из a + 5
, не будет соответствовать char
.