scala中有一個特殊的問題,每次都會咬我。每它咬我的時候,它就咬很辛苦......斯卡拉平等:爲什麼這個代碼編譯?
爲什麼這行編譯
val x = "10"
if (x != 10) {
print("do something")
}
此行編譯和執行,但對於像斯卡拉一個「類型安全」的語言......這行應導致編譯錯誤
scala中有一個特殊的問題,每次都會咬我。每它咬我的時候,它就咬很辛苦......斯卡拉平等:爲什麼這個代碼編譯?
爲什麼這行編譯
val x = "10"
if (x != 10) {
print("do something")
}
此行編譯和執行,但對於像斯卡拉一個「類型安全」的語言......這行應導致編譯錯誤
因爲所有類型的祖先都是Any,並且Any定義了方法!=
。見http://www.scala-lang.org/api/current/index.html#scala.Any
所以編譯器向後彎曲,使你的代碼編譯,並且上升的String("10")
類型層次結構,直到它發現需要一個整數
模式匹配給你一個多一點幫助!=
的實現。
scala> val i = 17
i: Int = 17
scala> "42" match { case `i` => }
<console>:13: error: type mismatch;
found : Int
required: String
"42" match { case `i` => }
^
scala> case class C(i: Int)
defined class C
scala> 42 match { case C(_) => }
<console>:14: error: constructor cannot be instantiated to expected type;
found : C
required: Int
42 match { case C(_) => }
^
你應該看看scalaz'==='運算符來得到你想要的。 http://stackoverflow.com/a/30243825/4080476 –
你爲什麼認爲它不應該編譯? '10'不等於'「10」',所以你得到的結果是正確的。爲什麼你認爲應該不可能比較不同類型的對象? – Dima
'=='只是一種方法,而不是操作符,你會如何做到這一點? –