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.0AnyRef匹配,但是在第二种情况下不匹配。 (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,如果应该将其解释为Doublejava.lang.Double,则在后者的情况下,AnyRef应该捕获它。确实如此。但是,如果您专门要求Double,它知道应该将其拆箱,则无需检查AnyRef大小写。 (而且,实际上,如果您打算将其作为java.lang.Double,它将也将其取消装箱-它无法分辨出区别。)

这是否是理想的行为值得商de,但这是合乎逻辑的。

10-06 11:27