【发布时间】:2011-12-26 11:42:09
【问题描述】:
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
编辑 - Scala 2.10 2013 年 1 月更新:新的模式匹配器修复了此行为(或至少使其保持一致)并且方法 test2 现在返回与 test1 一样的“AnyRef” .
【问题讨论】:
-
编译时生成的是 if(a instanceof Double) { if(a > 2) { return "Double > 2"} else { return "None of the Above" } } else { if( a instanceof Object) { return "AnyRef"} else {return "None of the Above"}} 。因此,除非有人在 scala 规范中找到某些东西,否则我认为这是 scala 编译器错误
-
1.0是Double的子类型,它是Any但不是AnyRef的子类型,与java.lang.Double不同。所以我什至想知道为什么1.0与test1中的AnyRef匹配。 -
我删除了我的答案。这不是一个错误——我没有注意到你正在匹配
AnyRef。雷克斯科尔是正确的。 -
@PeterSchmitz:根据规范,你是对的。