java switch表达式不能是浮点型、双精度型或布尔型

dphi5xsq  于 2022-12-28  发布在  Java
关注(0)|答案(6)|浏览(513)

为什么switch表达式在Java中不允许longfloatdoubleboolean值?为什么只允许int(以及那些自动提升为int的值)?

dtcbnfnu

dtcbnfnu1#

Float和double即使有可能也很难可靠地使用, -不要忘记,由于表示的本质,在float/double上执行精确的相等匹配通常是一个坏主意。
对于布尔值,为什么不直接使用if作为开始呢?
老实说,我不记得我曾经想要打开这些类型中的任何一个,你脑子里有一个特定的用例吗?

ryoqjall

ryoqjall2#

你可以在switch语句中使用enum,Java 7会添加String AFAIK。switch语句来自C语言,在C语言中只允许int类型,实现其他类型则更为复杂。
浮点数不是一个很好的开关候选,因为精确的比较经常被舍入误差破坏。例如0.11 - 0.1 == 0.01是假的。
boolean上switch没有多大用处,因为普通的if语句会更简单

if(a) {

} else { 

}

不会更简单

switch(a) {
  case true:

     break;
  case false:

     break;
}

顺便说一句:如果switch(long)可用,我会使用它,但它不是。这对我来说是一个罕见的用例。

nvbavucw

nvbavucw3#

对于float和double float和double,我假设他们出于与why it's a bad idea to compare them using ==相同的原因省略了它。
对于布尔值,可能只是因为它总是对应于if语句,记住在case-expression中只能有常量,所以case-expression总是对应于if (someBool)if (!someBool)
对于long我没有解释。在我看来,这样的特性也许应该在设计语言时就包括在内。

kx7yvsdv

kx7yvsdv4#

通常在执行基于状态变量的操作时使用switch-case结构。int有足够多的选项。Boolean只有两个选项,所以一般的if就足够了。double和float在这种情况下使用并不准确。
坦率地说,我无法想象这种东西的用例,你对这个问题有什么实际问题吗?

abithluo

abithluo5#

双人间也有同样的问题,有一个解决方案。
switch大括号内,将double强制转换为String,然后转换为docase "String"。例如:

double d = 1.5
switch (String.valueOf(d)) {
       case "1.5": 
       break;
}
vktxenjb

vktxenjb6#

是的,Java不允许布尔型、双精度型第一个是Switch语句,它最初取自C语言,在C语言中Switch语句只支持整数在Switch中使用,但是Java也在JAva7中添加了一个String,在Switch中用来比较预定义的String.double和floatdouble和float值可以从任何最接近的值舍入并再次变为整数,在这种情况下,可能存在在switch语句中选择两种不同情况的可能性,所以在Switch语句中使用double和float不是一个好主意。

boolean对于true和false,我们可以使用if和else,为什么还要使用Switch。?为了找到正确的大小写,Switch语句将搜索大小写,直到它以默认大小写结束。因此,仅对于2个大小写,不需要使用Switch语句。

相关问题