2017-10-06 27 views
1

有人能向我解釋爲什麼這個代碼塊打印那些 通常情況下,我們使用線時使用像是多種可能性控制數據流!是!在這裏是我的代碼:如何通過控制數據流在科特林當正確

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

回答

4

以逗號分隔的條件與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