def test1(a: Any) = a match {
case x: AnyRef => "AnyRef"
case _ => "None of the above"
}
def test2(a: Any) = a match {
case x: Double if x > 2 => "Double > 2"
case x: AnyRef => "AnyRef"
case _ => "None of the above"
}
请有人可以解释为什么在以下情况下,第一种情况
1.0
与AnyRef
匹配,但是在第二种情况下不匹配。 (Scala 2.9.0-1)scala> test1(1.0)
res28: java.lang.String = AnyRef
scala> test2(1.0)
res29: java.lang.String = None of the above
edit- Scala 2.10更新,2013年1月:新的模式匹配器修复了此行为(或至少使其保持一致),并且
test2
方法现在像test1
一样返回“AnyRef”。 最佳答案
这是因为Any
实际上只是Object
。使用Double
可以方便地找到小说-实际上是java.lang.Double
,它会在match语句中自动为您取消装箱。不幸的是,Scala无法告诉它是否找到了java.lang.Double
,如果应该将其解释为Double
或java.lang.Double
,则在后者的情况下,AnyRef
应该捕获它。确实如此。但是,如果您专门要求Double
,它知道应该将其拆箱,则无需检查AnyRef
大小写。 (而且,实际上,如果您打算将其作为java.lang.Double
,它将也将其取消装箱-它无法分辨出区别。)
这是否是理想的行为值得商de,但这是合乎逻辑的。