为什么scala模式匹配不等同于isInstanceOf

时间:2015-06-04 23:47:19

标签: scala casting pattern-matching

我相信很长一段时间,这两个结构是等价的:

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")

1 个答案:

答案 0 :(得分: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

期间,

java.lang.Double被隐式转换为n