Это неясно. Действительно неясен.
Первая версия работает, потому что JLS говорит в разделе §5.2 , что вы можете присвоить значение int
переменной byte
, если значение является результатом константа И значение int находится в диапазоне от -128 до +127. постоянная переменная является постоянным выражением , а final int x = 127;
объявляет постоянную переменную .
Вторая версия не работает, поскольку final int x;
не объявляет постоянную переменную . JLS сообщает следующее в разделе §4.12.4 :
Постоянная переменная - это конечная переменная примитивного типа или типа String , которая инициализируется с помощью константного выражения (§15.28).
Во второй версии конечная переменная имеет пустой инициализатор и затем присваивается позже. В результате правило 5.5, допускающее сужение примитивных констант в присваивании, не допускается.
Почему final int x;
не может рассматриваться как постоянная времени компиляции?
Примите во внимание следующее:
final int x;
if (something) {
x = 127;
} else {
x = 1023;
}
byte b = x;
Следует ли разрешить инициализацию b
или это будет преобразование с потерями? Это зависит от значения something
.
Гипотетически, компилятор может решить в некоторых вариантах приведенного выше примера, что все возможные значения x
будут в порядке, но сложность в компиляторе и спецификации языка не оправданный.