6

我不明白为什么以下情况不匹配。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

谢谢。

4

4 回答 4

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 之外的所有类型的成员。

于 2010-01-08T02:27:33.533 回答
6

您是否尝试过占位v符?

val x = (2, null)
x match {
    case (i:Int, v) => println("got tuple %s: %s".format(i, v))
    case _ => println("catch all")
}
于 2010-01-08T15:14:54.820 回答
3

这是指定的(Scala 参考 2.7,第 8.2 节):

对 C、pC 或 T#C 类的引用。此类型模式匹配给定类的任何非空实例。请注意,如果给定类的前缀,则与确定类实例相关。例如,模式 pC 仅匹配以路径 p 作为前缀创建的类 C 的实例。

于 2010-01-08T02:29:27.273 回答
1

我只是在这里猜测,因为我不是 scala 专家,但根据 scala 中 Any 类的文档,我认为由于 null 不是对象,它不是从 Any 派生的,因此不是匹配第一个列出的案例。

在下面添加代码示例。它在运行时打印“其他东西”。

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 应该与文档所说的任何意义相匹配,它扩展了 AnyRef,它扩展了 Any。

编辑:就像其他人所说的那样。第一种情况故意与 null 不匹配。它在文档中指定。

于 2010-01-08T01:19:00.687 回答