2015-06-04 56 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