我不明白为什么以下情况不匹配。 Null应该是Any的实例,但它不匹配。有人可以解释发生了什么吗?
val x = (2, null)
x match {
case (i:Int, v:Any) => println("got tuple %s: %s".format(i, v))
case _ => println("catch all")
}
prints catch all
感谢。
答案 0 :(得分:9)
这完全符合规定。
Type patterns consist of types, type variables, and wildcards.
A type pattern T is of one of the following forms:
* A reference to a class C, p.C, or T#C.
This type pattern matches any non-null instance of the given class.
有趣的是,如此多的相关性归因于null是Any的成员。它是各种类型的成员,但AnyVal和Nothing。
答案 1 :(得分:6)
您是否尝试了任何的v
占位符?
val x = (2, null)
x match {
case (i:Int, v) => println("got tuple %s: %s".format(i, v))
case _ => println("catch all")
}
答案 2 :(得分:3)
这是指定的(Scala参考2.7,第8.2节):
对C,p.C或T#C类的引用。 此类型模式匹配给定类的任何非null实例。 注意类的前缀,如果 给出,是相关的 确定类实例。对于 例如,模式p.C只匹配 C类的实例 使用路径p作为前缀创建。
答案 3 :(得分:1)
我只是在这里猜测,因为我不是scala专家,但根据documentation对于scala中的Any类,我认为因为null不是一个对象,所以它不是从任何和因此不符合第一个列出的案例。
添加下面的代码示例。它在运行时打印“其他东西”。
val x = (2, null)
x match {
case (i:Int, v:Any) => println("got tuple %s: %s".format(i, v))
case (i:Int, null) => println("something else %s".format(i))
case _ => println("catch all")
}
经过更多的研究后,似乎null应与任何意义相匹配documentation表示它扩展AnyRef,扩展Any。
编辑:像其他人一样说。第一种情况不是故意匹配null。它在文档中指定。