如何通过控制数据流在科特林当正确

问题描述:

有人能向我解释为什么这个代码块打印那些 通常情况下,我们使用线时使用像是多种可能性控制数据流!是!在这里是我的代码:如何通过控制数据流在科特林当正确

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 
+0

顺便问一下,检查也可以作为'乐趣ISNUMBER完成(OBJ:任意)= obj是Number' 。 – hotkey

以逗号分隔的条件与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,而不是检查是否objInt一个实例。

而且,即使我们增加!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等

+0

这就是我认为的OP语法是错误的,因为他比较了'obj'是'Long'还是如果'obj'是类类型'Int','Float'或'Double'。说这个,你的解决方案既不起作用,但它应该..... – Arturo

+0

真的,它不工作,将编辑。 – FWeigl

+2

只需要说一句:'Int'出现在'Long'中,Int'不是类型,而是'Int'类型的伴侣对象。 – hotkey