Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java和交换机外壳_Java - Fatal编程技术网

Java和交换机外壳

Java和交换机外壳,java,Java,有人知道为什么Java不允许切换大于整数的数字吗?这背后有什么技术原因吗?可能是因为在一个开关中有超过整数最大值的情况是非常糟糕的编程 如果要切换长变量,只需在整数空间中投影它们。如前所述,switch可用于byte、short、char和int基元数据类型。它还适用于枚举类型和一些特殊类,这些类“包装”某些基本类型:字符、字节、短字符和整数 Java switch语句被编译成。这两种字节码都要求大小写值是唯一的、32位的整数编译时常量 tableswitch和lookupswitch指令都包括

有人知道为什么Java不允许切换大于整数的数字吗?这背后有什么技术原因吗?

可能是因为在一个开关中有超过整数最大值的情况是非常糟糕的编程

如果要切换长变量,只需在整数空间中投影它们。

如前所述,switch可用于byte、short、char和int基元数据类型。它还适用于枚举类型和一些特殊类,这些类“包装”某些基本类型:字符、字节、短字符和整数

Java switch语句被编译成。这两种字节码都要求大小写值是唯一的、32位的整数编译时常量

tableswitch和lookupswitch指令都包括一个默认分支偏移量和一组可变长度的大小写值/分支偏移量对。
这两条指令都从堆栈中弹出键(switch关键字后面括号中表达式的值)。
将该键与所有案例值进行比较:

  • 如果找到匹配项,则采用与案例值关联的分支偏移量
  • 如果未找到匹配项,则采用默认分支偏移量
尽管以上描述了实现细节,但我相信用于切换的类型是与控制流的有效字节码兼容的类型,它可能是这个选择的一个重要部分

如本文所述:

我想您可以允许Java switch语句案例包含其他类型的值,并将使用这些值之一的switch语句编译成其他字节码,例如ifs和GOTO序列。但是我们必须仔细检查所有的switch语句,以确定它是编译成快速的switch字节码,还是编译成慢速的if-else序列

正如在另一篇文章中所说的

“switch”语句可以使用函数表分派和/或二叉树搜索来匹配case语句,比按顺序逐个测试它们更快


我的猜测是,long作为一种有效的switch表达式类型被删除了,因为与long变量上的操作相关。

Scala,一种构建在JVM之上的语言,允许您定义自己的case类,可以在switch语句中使用。因此,在switch语句中使用long、double或string肯定是可能的

我不知道它有多复杂,有多有效。对于简单类型,编译器只计算要在表上跳转的偏移量。对于更复杂的类型,情况绝对不是这样


我想答案与java的设计时间和设计者试图实现的目标有关。Java最初的目标是设计一个“更好的C++”,可以在许多环境中移植。我可以理解为什么复杂类型上的开关不适合它。

如果您发现本机java开关构造的限制太大,请看一看允许通过与一些hamcrest匹配器匹配来声明性地切换任何对象的方法。

这是实现细节。不是这个选择的真正原因。请不要否决这个答案!它解释了为什么Java语言设计者认为将switch语句限制为32位类型是合理的。这不是一个原因,而是猜测。将long投影到整数空间也会破坏使用long的目的。这将是一个相当愚蠢的原因,想象一下需要切换一些长位序列。我不认为这是原因。如果是这样的话,那么如果其他人也应该受到限制,对吗?我认为这与VonC指出的处理器寻址模式有关(因为switch不像else结构那样编译成相同的字节码)。