Почему во время автобоксирования происходит ошибка компиляции 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;
Другие вопросы по тегам