TL;DR находится в конце.
Изучив документацию оператора switch, мы можем найти следующий:
Переключатель работает с примитивными типами данных byte, short, char и int. Он также работает с перечислимыми типами (обсуждаемыми в Enum Types), классом String и несколькими специальными классами, обертывающими определенные примитивные типы: Character, Byte, Short и Integer (обсуждаемые в Numbers and Strings).
Сначала это кажется нормальным, и вашей проблемы не должно существовать. Однако в определении не упоминается, где эти оболочки можно использовать, а где нет. Изучая спецификации коммутатора- операторов (JLS) мы находим, что переключатель имеет форму:
1 Switch-Expression
SwitchStatement:
switch ( Expression ) SwitchBlock
Далее поясняется Expression
:
Тип Expression должен быть char, byte, short, int, Character, Byte, Short, Integer, String или тип перечисления (§8.9), иначе возникает ошибка времени компиляции.
Так что здесь совершенно нормально использовать класс-оболочку, такой как Integer
. Компилятор справится.
2 Switch-Block
Блок-переключатель можно разбить на:
SwitchLabels BlockStatements
SwitchLabel
определяется как:
SwitchLabel:
case ConstantExpression :
case EnumConstantName :
default :
Таким образом, метка будет принимать только константные выражения или перечисления. Если мы теперь посмотрим на определение константного выражения, мы найдем:
Константное выражение — это выражение, обозначающее значение примитивного типа или строку...
Конечно, некоторые условия должны применяться, чтобы сделать примитивный тип константой (он указан там), но в вашем случае важной частью является то, что вы должны использовать примитивный тип или строку.
БОНУС
Обмен между классом-оболочкой и примитивным типом называется "автоупаковка или распаковка" (в зависимости от направления). Согласно документации, распаковка происходит, когда:
Преобразование объекта типа-оболочки (Integer
) в соответствующее значение примитива (int
) называется распаковкой. Компилятор Java применяет распаковку, когда объект класса-оболочки:
- Передается как параметр методу, который ожидает значение соответствующего примитивного типа.
- Присваивается переменной соответствующего примитивного типа.
Таким образом, похоже, что Java просто не предназначена для выполнения необходимой распаковки, чтобы оператор switch работал, как вы предполагали.
----------------------
TL;DR
Для выражения переключения вы можете использовать класс-оболочку. Однако для меток вы можете использовать только примитивные типы: byte, short, char и int.
person
Younes EO
schedule
24.02.2019
x1
не будет равноx1
? - person Turing85   schedule 24.02.2019