如何通过控制数据流在科特林当正确
问题描述:
有人能向我解释为什么这个代码块打印那些 通常情况下,我们使用线时使用像是多种可能性控制数据流!是!在这里是我的代码:如何通过控制数据流在科特林当正确
fun isNumber(obj: Any) {
when (obj) {
!is Long, Int, Float, Double -> {
println("No it's not a number")
}
else -> {
println("Yes it's a number")
}
}
}
fun main(args: Array<String>) {
isNumber(19.10)
isNumber(19L)
isNumber(19)
isNumber(19.10F)
}
结果:
No it's not a number
Yes it's a number
No it's not a number
No it's not a number
答
以逗号分隔的条件与OR
评估,各由自己,所以我们应该扭转这种像这样:
when (obj) {
is Long, is Int, is Float, is Double -> {
println("Yes it's a number")
}
else -> {
println("No it's not a number")
}
}
您的结构不工作的原因是,当你离开了在!is Long, Int, Float, Double ->
的is
以后,我们(简体):
when (obj) {
Int -> {
}
else -> {
}
}
这意味着你是否obj
等于类Int
,而不是检查是否obj
是Int
一个实例。
而且,即使我们增加!is
到每一个号码类型,如:
when (obj) {
!is Long, !is Int, !is Float, !is Double -> {
println("No it's not a number")
}
else -> {
println("Yes it's a number")
}
}
它仍然是行不通的,因为如上所述,这些条件将与OR
评估,所以一切都将是“不一些”,因为一切都是要么不一个长期或不一个Int等
顺便问一下,检查也可以作为'乐趣ISNUMBER完成(OBJ:任意)= obj是Number' 。 – hotkey