如何在kotlin中正确地控制数据流

有人可以向我解释为什么这个代码块通常会打印这些行,我们使用何时来控制数据流使用多种可能性就像是!在这里是我的代码:

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 !is Long, Int, Float, Double ->那么我们有(简化):

  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来评估,所以一切都将是“不是一个数字”,因为一切都不是一个长 不是一个整数等等。