Scala:在使用空值取消应用元组时出现奇怪的MatchError

hol*_*ech 5 scala

任何精通Scala的人都可以解释为什么这样有效:

scala> Tuple2[String,String]("w3wre", "werffd")
res0: (String, String) = (w3wre,werffd)

scala> val (s1:Any, s2:Any) = Tuple2[String,String]("w3wre", "werffd")
s1: Any = w3wre
s2: Any = werffd
Run Code Online (Sandbox Code Playgroud)

但不是吗?

scala> Tuple2[String,String]("w3wre", null)
res1: (String, String) = (w3wre,null)

scala> val (s1:Any, s2:Any) = Tuple2[String,String]("w3wre", null)
scala.MatchError: (w3wre,null) (of class scala.Tuple2)
    at .<init>(<console>:9)
    at .<clinit>(<console>)
...
Run Code Online (Sandbox Code Playgroud)

(显然Any-type可以包含nulls:

scala> val n:Any = null
n: Any = null

scala> val n:Any = null.asInstanceOf[String]
n: Any = null
Run Code Online (Sandbox Code Playgroud)

)

rig*_*old 6

语言规范明确指出这种类型模式不匹配null(8.2 Type Patterns,强调我的):

类型模式由类型,类型变量和通配符组成.类型模式T具有以下形式之一:

  • C,pCT#C类的引用.此类型模式匹配给定类的任何非null实例.

但是,我不知道语言设计者的背后推理不匹配null.

  • 也许是因为它可能导致一些违反直觉的结果 - 例如`(null:Any)匹配{case _:String =>"string"; case _:Int =>"int"; case _ =>"other"}`将评估为""字符串"`. (2认同)