簡體   English   中英

為什么Scala模式匹配不等於isInstanceOf

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM