[英]Why scala pattern matching is not equivalent to isInstanceOf
我長期以來認為這兩種構造是等效的:
if (myVar.isInstanceOf[MyType]) myVar.asInstanceOf[MyType].doSomething
和
myVar match {
case my : MyType => my.doSomething
case _ => {}
}
但是突然我發現嘗試將Number
值匹配到Double
類型時遇到類型錯誤,但是asInstanceOf[Double]
可以正常工作。 WTF正在發生?
scala REPL的簡單示例
val d = 3.5
val n : Number = d
n.isInstanceOf[Double]
工作正常:
Boolean = true
但
n match {
case x : Double => println("double")
case _ => println("not a double")
}
產生類型錯誤:
:11: error: pattern type is incompatible with expected type;
found : Double
required: Number
case x : Double => println("double")
scala.Double
不是從java.lang.Number
繼承,而是從AnyVal
繼承。 您要在java.lang.Double
上進行匹配:
n match {
case x : java.lang.Double => println("double")
case _ => println("not a double")
}
使用時
val d = 3.5
val n : Number = d // implicit conversion from scala.Double to java.lang.Double
scala.Double
賦值給n
隱式轉換為java.lang.Double
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.