有没有人知道为什么Java不允许你打开大于整数的数字?这背后有任何技术原因吗?
至于说在这里,开关用字节,短,char和INT基本数据类型的作品.它还适用于枚举类型和一些"包装"某些基本类型的特殊类:Character,Byte,Short和Integer.
Java switch语句被编译到JVM字节码tableswitch或lookupswitch中.这两个字节码都要求case值是唯一的,32位,整数,编译时常量.
tableswitch和lookupswitch指令都包括一个默认分支偏移和一组可变长度的case值/分支偏移对.
两个指令都从堆栈中弹出密钥(紧跟在switch关键字后面的括号中的表达式的值).
将密钥与所有案例值进行比较:
如果找到匹配,则采用与案例值相关联的分支偏移.
如果未找到匹配项,则采用默认分支偏移量.
尽管上面描述了实现细节,但我相信用于切换的类型是与控制流的高效字节码兼容的类型,并且它可能是这种选择的重要部分.
正如在这个Java Bug中所说:
我想您可以允许Java switch语句包含其他类型的值,并编译一个switch语句,该语句将这些值中的一种用于其他字节码,例如ifs和gotos序列.但是我们必须仔细检查所有的switch语句,以确定它是否会被编译成快速切换字节码或if-elses的慢速序列.
正如在其他Java bug中所说的那样
'switch'语句可以使用函数表调度和/或二叉树搜索来匹配case语句,而不仅仅是按顺序逐个测试它们.