2015-06-04 89 views
0

我相信很長一段時間,這兩個方案是等價的:爲什麼Scala的模式匹配不等同於isInstanceOf

if (myVar.isInstanceOf[MyType]) myVar.asInstanceOf[MyType].doSomething 

myVar match { 
    case my : MyType => my.doSomething 
    case _ => {} 
} 

但是突然我發現,我得到的類型錯誤,同時嘗試將Number值與Double類型匹配,但asInstanceOf[Double]正常工作。跆拳道正在發生?


爲階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") 
+0

'? – marios

回答

1

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您可以發佈與`Number`的例子和`雙隱式地分配過程中轉化爲java.lang.Doublen

+0

你的第一句話不要倒過來嗎? – Bergi

+0

不是。 n是一個真正的java.lang.Double - 匹配作品,測試:) –

+0

是的,這就是你的意思,但你寫了**'scala' **'.'Double' – Bergi