Почему во время автобоксирования происходит ошибка компиляции final long to Byte, но финальное int в Byte нормально?
Там нет ошибки во время автобокс констант с int
а также short
типы для Byte
, но постоянный с long
Тип do имеет ошибку. Зачем?
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:
- Сужающее примитивное преобразование может использоваться, если тип переменной - byte, short или char, и значение константного выражения представимо в типе переменной.
Преобразование примитива сужения, сопровождаемое преобразованием бокса, может использоваться, если тип переменной:
- Байт и значение константного выражения представляются в байте типа.
- ...
Это просто не допускается для long
по спецификации.
Обратите внимание, что второй пункт здесь говорит о том, что это происходит независимо от бокса: назначение константы long
выражение для byte
переменная также потерпит неудачу:
// Both compiler errors.
byte primitive = 0L;
Byte wrapped = 0L;