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

Конечные символы в 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 здесь?

4b9b3361

Ответ 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.