switch表达式不能是float,double或boolean

sar*_*nan 31 java switch-statement

为什么不switch表达允许long,float,doubleboolean在Java中值?为什么只允许 int(和那些自动升级的int)允许?

Jon*_*eet 33

即使它们是可能的,浮点数和双精度也难以可靠地使用 - 不要忘记,由于表示的性质,无论如何在float/double上执行精确的相等匹配通常都是一个坏主意.

对于布尔值,为什么不只是if用来开始?

老实说,我不记得曾经想要打开这些类型中的任何一种.你有特定的用例吗?

  • @owlstead:1.1不是有效的`float`或`double`数字.你可以有一个文字,它将转换为*最接近的*`float`或`double`,但两者都不能精确地代表1.1.你真的是指版本1.100000000000000088817841970012523233890533447265625(`double`)或版本1.10000002384185791015625(`float`)? (5认同)
  • 我可以看到“float”或“double”版本信息的用例。如果您不进行任何计算,`1.1` 将始终是 `1.1`。甚至 Java 有时也会使用这个技巧来显示版本信息。但我想我们必须字节公告并与代表“Version”的实际对象实例进行比较 - 或者当然从 Java 7 开始使用“String”比较。 (2认同)
  • @owlstead:这很重要,因为从根本上来说,这是一种不合适的类型。此外,您要如何处理更特定的版本?如果要以1.1.1为例?显然不能将其表示为“ float”或“ double”。即使只有主要/次要版本,您也会遇到奇怪的事情-版本1.10(主要版本1中的第11个次要版本)将等于1.1。这有什么用?在我看来,使用`float`或`double`作为版本号只是“错误”。 (2认同)

Pet*_*rey 5

您可以enum在switch语句中使用Java 7将添加String AFAIK。switch语句来自C,其中仅允许int,而实现其他类型则更加复杂。

浮点数不是切换的理想选择,因为精确比较经常会由于舍入误差而中断。例如0.11 - 0.1 == 0.01是错误的。

开启boolean并没有多大用处,因为简单的if声明会更简单

if(a) {

} else { 

}
Run Code Online (Sandbox Code Playgroud)

不会更简单

switch(a) {
  case true:

     break;
  case false:

     break;
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句:我会使用switch(long),如果有的话,但是没有。无论如何,这对我来说都是罕见的用例。