Почему я не могу назначить финал long для int? - PullRequest
9 голосов
/ 12 июня 2019

Насколько я понимаю, оценка переменной выполняется во время выполнения. Однако оценка типов выполняется во время компиляции в Java.

Также, как я вижу, создание постоянной переменной (я использую локальные переменные, но она ничего не меняет в концепции выше), сделает ее значение известным во время компиляции.

Я приведу два примера для проверки этой концепции. Первый работает, а второй нет.

Может ли кто-нибудь объяснить мне, почему присвоение переменной постоянной позволяет мне назначать короткую переменную для переменной int, тогда как я не могу назначить переменную int для длинной?

// Working example
final int x = 10;
short y = x;

// Non-working example
final long a = 10L;
int b = a;

1 Ответ

15 голосов
/ 12 июня 2019

Соответствующей частью языковой спецификации является JLS 5.2, контексты присвоения :

Кроме того, если выражение является константным выражением (§15.28) типа byte, short, char или int:

  • Может использоваться сужающее примитивное преобразование, если переменная имеет тип byte, short или char, а значение константного выражения представлено в типе переменной.

Создание переменных a и x final делает их постоянными выражениями (потому что они тоже инициализируются постоянными значениями).

Первый пример работает, потому что x - это константа int, которую вы пытаетесь присвоить переменной short, а значение представляется в short; во втором примере это не так, потому что x является константой long, и вы пытаетесь присвоить ее переменной int (значение представимо, но это не имеет значения, поскольку оно уже исключено из неявного сужение конверсии).

...