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
,但在第二个中却没有。 (斯卡拉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
现在返回“AnyRef”test1
.
这是因为Any
实际上只是一个Object
。拥有Double
有一个方便的虚构——它实际上是java.lang.Double
它会在匹配语句中自动为您拆箱。不幸的是,Scala 无法判断它是否找到了java.lang.Double
如果它应该被解释为Double
或作为java.lang.Double
——在后一种情况下,AnyRef
应该抓住它。确实如此。但如果你特别ask for a Double
,它知道应该拆箱,然后AnyRef
情况无需检查。 (而且,事实上,如果你打算把它变成java.lang.Double
,它也会拆箱——它无法区分。)
这是否是ideal行为是有争议的,但它是合乎逻辑的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)