在kotlin中正确使用时如何控制数据流

在kotlin中正确使用时如何控制数据流,kotlin,Kotlin,有人能给我解释一下为什么这些代码会打印这些行吗 通常,我们使用多种可能性来控制数据流,如is!他进来了!下面是我的代码: fun isNumber(obj: Any) { when (obj) { !is Long, Int, Float, Double -> { println("No it's not a number") } else -> { println("Yes i

有人能给我解释一下为什么这些代码会打印这些行吗 通常,我们使用多种可能性来控制数据流,如is!他进来了!下面是我的代码:

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)

}

逗号分隔的条件使用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")
        }
    }
您的构造不起作用的原因是,当您忽略时,它是在!是Long,Int,Float,Double->然后我们简化了:

   when (obj) {
            Int -> {
            }
            else -> {
            }
        }
这意味着检查obj是否等于Int类,而不是检查obj是否是Int的实例

此外,即使我们添加了!适用于每种数字类型,如:

   when (obj) {
        !is Long, !is Int, !is Float, !is Double -> {
            println("No it's not a number")
        }
        else -> {
            println("Yes it's a number")
        }
    }

它仍然不起作用,因为如前所述,条件将使用或进行计算,因此所有条件都将是“非数字”,因为所有条件都不是长的或不是整数等。

逗号分隔的条件都使用或进行计算,每个条件都有自己的值,因此我们应该像这样扭转局面:

    when (obj) {
        is Long, is Int, is Float, is Double -> {
            println("Yes it's a number")
        }
        else -> {
            println("No it's not a number")
        }
    }
您的构造不起作用的原因是,当您忽略时,它是在!是Long,Int,Float,Double->然后我们简化了:

   when (obj) {
            Int -> {
            }
            else -> {
            }
        }
这意味着检查obj是否等于Int类,而不是检查obj是否是Int的实例

此外,即使我们添加了!适用于每种数字类型,如:

   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等。

这就是我所想的,OP语法是错误的,因为他正在比较obj是否长,以及obj是否是Int、Float或Double类类型。这么说,您的解决方案既不起作用,但它应该……只是一句话:中出现的Int是Long,Int不是类型,而是Int类型的伴生对象。这就是我所想的,OP语法是错误的,因为他正在比较obj是Long还是obj是Int、Float或Double类型的类。这么说,你的解决方案既不起作用,但它应该……只是一句话:中出现的Int很长,Int不是类型,而是Int类型的伴随对象。顺便说一下,检查也可以按fun isNumberobj:Any=obj是数字来做。顺便说一下,检查也可以按fun isNumberobj:Any=obj是数字来做。