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