我相信很长一段时间,这两个结构是等价的:
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")
答案 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