Почему во время автобоксинга окончательная длинная ошибка байтовой компиляции происходит, но окончательный int Byte в порядке?

Во время автоматического бокса констант с int и short не существует ошибок при Byte, но константа с типом long имеет ошибку. Почему?

final int i = 3;
Byte b = i; // no error

final short s = 3;
Byte b = s; // no error


final long l = 3;
Byte b = l; // error

Ответы

Ответ 1

От JLS Sec 5.2, "контексты присваивания" (внимание):

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

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

    • Байт и значение константного выражения представляются в байте типа.
    • ...

Это просто не разрешено для long по спецификации.

Обратите внимание на то, что вторая точка указывает на то, что это происходит независимо от бокса: назначение константного выражения long переменной byte также сработало бы:

// Both compiler errors.
byte primitive = 0L;
Byte wrapped = 0L;