为什么switch表达式在Java中不允许long、float、double或boolean值?为什么只允许int(以及那些自动提升为int的值)?
switch
long
float
double
boolean
int
dtcbnfnu1#
Float和double即使有可能也很难可靠地使用, -不要忘记,由于表示的本质,在float/double上执行精确的相等匹配通常是一个坏主意。对于布尔值,为什么不直接使用if作为开始呢?老实说,我不记得我曾经想要打开这些类型中的任何一个,你脑子里有一个特定的用例吗?
if
ryoqjall2#
你可以在switch语句中使用enum,Java 7会添加String AFAIK。switch语句来自C语言,在C语言中只允许int类型,实现其他类型则更为复杂。浮点数不是一个很好的开关候选,因为精确的比较经常被舍入误差破坏。例如0.11 - 0.1 == 0.01是假的。boolean上switch没有多大用处,因为普通的if语句会更简单
enum
0.11 - 0.1 == 0.01
if(a) { } else { }
不会更简单
switch(a) { case true: break; case false: break; }
顺便说一句:如果switch(long)可用,我会使用它,但它不是。这对我来说是一个罕见的用例。
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我没有解释。在我看来,这样的特性也许应该在设计语言时就包括在内。
==
if (someBool)
if (!someBool)
kx7yvsdv4#
通常在执行基于状态变量的操作时使用switch-case结构。int有足够多的选项。Boolean只有两个选项,所以一般的if就足够了。double和float在这种情况下使用并不准确。坦率地说,我无法想象这种东西的用例,你对这个问题有什么实际问题吗?
abithluo5#
双人间也有同样的问题,有一个解决方案。在switch大括号内,将double强制转换为String,然后转换为docase "String"。例如:
String
case "String"
double d = 1.5 switch (String.valueOf(d)) { case "1.5": break; }
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语句。
6条答案
按热度按时间dtcbnfnu1#
Float和double即使有可能也很难可靠地使用, -不要忘记,由于表示的本质,在float/double上执行精确的相等匹配通常是一个坏主意。
对于布尔值,为什么不直接使用
if
作为开始呢?老实说,我不记得我曾经想要打开这些类型中的任何一个,你脑子里有一个特定的用例吗?
ryoqjall2#
你可以在switch语句中使用
enum
,Java 7会添加String AFAIK。switch语句来自C语言,在C语言中只允许int类型,实现其他类型则更为复杂。浮点数不是一个很好的开关候选,因为精确的比较经常被舍入误差破坏。例如
0.11 - 0.1 == 0.01
是假的。boolean上switch没有多大用处,因为普通的
if
语句会更简单不会更简单
顺便说一句:如果switch(long)可用,我会使用它,但它不是。这对我来说是一个罕见的用例。
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
我没有解释。在我看来,这样的特性也许应该在设计语言时就包括在内。kx7yvsdv4#
通常在执行基于状态变量的操作时使用switch-case结构。int有足够多的选项。Boolean只有两个选项,所以一般的if就足够了。double和float在这种情况下使用并不准确。
坦率地说,我无法想象这种东西的用例,你对这个问题有什么实际问题吗?
abithluo5#
双人间也有同样的问题,有一个解决方案。
在
switch
大括号内,将double
强制转换为String
,然后转换为docase "String"
。例如: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语句。