Ответ 1
От JLS Sec 5.2, "контексты присваивания" (внимание):
Кроме того, если выражение является константным выражением (§15.28) типа byte, short, char или int:
- Сужение примитивного преобразования может быть использовано, если тип переменной является байтом, коротким или char, а значение константного выражения представляется в типе переменной.
Сужение примитивного преобразования, за которым следует преобразование бокса, может быть использовано, если тип переменной:
- Байт и значение константного выражения представляются в байте типа.
- ...
Это просто не разрешено для long
по спецификации.
Обратите внимание на то, что вторая точка указывает на то, что это происходит независимо от бокса: назначение константного выражения long
переменной byte
также сработало бы:
// Both compiler errors.
byte primitive = 0L;
Byte wrapped = 0L;