有没有人知道为什么Java不允许你打开大于整数的数字?这背后有任何技术原因吗?
答案 0 :(得分:23)
如上所述here,switch使用byte,short,char和int原始数据类型。它还适用于枚举类型和一些“包装”某些基本类型的特殊类:Character,Byte,Short和Integer。
Java switch语句被编译为JVM bytecode tableswitch or lookupswitch。这两个字节码都要求case值是唯一的,32位,整数,编译时常量。
tableswitch和lookupswitch指令都包括一个默认的分支偏移和一组可变长度的case值/分支偏移对。
两个指令都从堆栈中弹出键(紧跟在switch关键字后面的括号中的表达式的值)
将密钥与所有案例值进行比较:
即使以上代表实现细节,我相信用于切换的类型是与控制流的高效字节码兼容的类型,它可能是一个重要的部分,因为这个选择。
如前所述Java Bug:
我认为您可以允许Java switch语句包含其他类型的值,并编译一个switch语句,该语句将这些值中的一种用于其他字节码,例如ifs和gotos序列。但是我们必须仔细检查所有的switch语句,以确定它是否会被编译成快速切换字节码或if-elses的慢速序列。
正如其他Java bug
所述'switch'语句可以使用函数表调度和/或二叉树搜索来匹配case语句,而不仅仅是按顺序逐个测试它们。
答案 1 :(得分:1)
Scala是一种构建在JVM之上的语言,允许您定义自己的case类,可以在switch语句中使用。因此,在switch语句中使用longs,double或strings肯定是可能的。
然而,我不知道它有多复杂和多么有效。对于简单类型,编译器只计算要在表上跳转的偏移量。对于更复杂的类型,情况绝对不是这样。
我认为答案与java设计的时间和设计师试图实现的目标有关。 Java最初的目标是设计一个“更好的C ++”,可在许多环境中移植。我可以理解为什么复杂类型的开关不适合它。
答案 2 :(得分:0)
我的猜测是,由于长变量may not be atomic上的操作事实/与之相关,因此长时间被删除为有效的切换表达式类型。
答案 3 :(得分:0)
如果您发现本机java开关构造过于局限,请查看允许通过将它们与某些hamcrest匹配器进行匹配来声明性地切换任何对象的lambdaj Switcher。
答案 4 :(得分:-8)
也许是因为在交换机中拥有超过整数最大个案的编程真的很糟糕?
如果要切换长变量,只需在整数空间中进行投影即可。