为什么switch
表达式不允许Java中的long
,float
,double
或boolean
值?为什么只允许int
(以及自动提升为int
的那些)?
答案 0 :(得分:29)
即使可能,浮点数和双精度也难以可靠使用 - 不要忘记在float / double上执行完全相等的匹配通常是一个坏主意,因为表示的性质。
对于布尔值,为什么不使用if
来开始?
我不记得永远想要打开任何这些类型,说实话。你有特定的用例吗?
答案 1 :(得分:4)
您可以在switch语句中使用enum
,Java 7将添加String AFAIK。 switch语句来自C,其中只允许使用int并且实现其他类型更复杂。
浮点数不适合交换机,因为精确比较通常会因舍入错误而中断。例如0.11 - 0.1 == 0.01
是假的。
开启布尔值没什么用,因为普通的if
语句会更简单
if(a) {
} else {
}
对不会更简单
switch(a) {
case true:
break;
case false:
break;
}
顺便说一下:如果可用,我会使用switch(long),但不是。对我来说这是一个罕见的用例。
答案 2 :(得分:1)
对于float和double float以及double,我假设他们已将其省略,原因与why it's a bad idea to compare them using ==
相同。
对于布尔值,它可能只是因为它无论如何都会对应if
语句。请记住,您只能在case-expression中使用常量,因此案例总是对应if (someBool)
和if (!someBool)
。
long
我没有解释。在我看来,在设计语言时可能应该包含这样的功能。
答案 3 :(得分:1)
通常在基于状态变量执行某些操作时使用switch-case结构。有一个int有足够的选项。布尔只有两个所以正常如果通常足够好。双打和花车并不是那么准确,以这种方式使用。
坦率地说,我无法想象这个问题的用例,你对这个问题有什么实际问题吗?