Кто-нибудь знает, почему Java не позволяет включать числа больше целых? Есть ли за этим какая-то техническая причина?




Может быть, потому что это действительно плохое программирование - иметь в переключателе больше, чем целое число max?
Если вы хотите переключить длинные переменные, просто поместите их в межчисленное пространство.
Это не повод, это домыслы. Проецирование длинного числа в целочисленное пространство также лишает смысла использование длинного числа.
Это было бы довольно глупой причиной, представьте, что вам нужно переключить несколько длинных битовых последовательностей.
Как сказано в здесь, switch работает с примитивными типами данных byte, short, char и int. Он также работает с перечисляемыми типами и несколькими специальными классами, которые «обертывают» определенные примитивные типы: Character, Byte, Short и Integer.
Оператор переключения Java компилируется в Переключатель таблиц байт-кода JVM или переключатель поиска. Оба этих байт-кода требуют, чтобы значения case были уникальными, 32-битными, целыми числами, константами времени компиляции.
Команды tablewitch и lookupswitch включают как одно смещение ветвления по умолчанию, так и набор пар переменной длины, состоящий из пары значений case / branch смещения. Обе инструкции извлекают ключ (значение выражения в скобках сразу после ключевого слова switch) из стека. Ключ сравнивается со всеми значениями case:
Несмотря на то, что приведенное выше представляет детали реализации, я считаю, что типы, используемые для переключения, совместимы с эффективным байт-кодом для потока управления, и это могло быть важной частью по причине этого выбора.
Как сказано в этом Ошибка Java:
I suppose you could allow Java switch statement cases to include other types of values, and compile a switch statement that uses one of those kinds of values into other bytecode, such as a sequence of ifs and gotos. But then we'd have to examine all switch statements carefully in order to determine if it will be compiled into a fast switch bytecode or a slow sequence of if-elses.
Как сказано в этом другом Ошибка Java
'switch' statements can use function-table dispatch and/or binary-tree search to match the case statements faster than just testing them one by one in order.
Это детали реализации. Не настоящая причина этого выбора.
Я предполагаю, что этот long был исключен как допустимый тип выражения переключения из-за /, связанного с тем, что операции с длинными переменными не может быть атомарным.
Не думаю, что причина в этом. Если это так, то если еще тоже следовало ограничить, верно? Я думаю, что это должно что-то делать с режимами адресации процессора, как указал VonC (потому что переключатель не компилируется в тот же байтовый код, что и структура else).
Scala, язык, построенный на основе JVM, позволяет вам определять свои собственные классы case, которые вы можете использовать в операторе switch. Таким образом, использование long, double или String в операторе switch, безусловно, возможно.
Однако я не знаю, насколько это сложно и насколько эффективно. С простыми типами компилятор просто вычисляет смещение для перехода по таблице. Это определенно не относится к более сложным типам.
Я полагаю, что ответ связан со временем разработки java и целями, которые дизайнеры пытались достичь. Первоначальной целью Java было создание «лучшего C++», переносимого во многие среды. Я могу понять, почему переключение сложных типов не подошло.
Если вы обнаружите, что встроенная конструкция переключателя Java слишком ограничивает, взгляните на лямбдаж-переключатель, который позволяет декларативно включать любой объект, сопоставляя их с некоторыми сопоставителями hamcrest.
Пожалуйста, не голосуйте против этого ответа! В нем объясняется, что Почему разработчики языка Java посчитали разумным ограничить оператор switch 32-битными типами.