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

时间:2015-07-17 11:03:29

标签: 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

但不是吗?

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>)
...

(显然任何类型都可以包含null s:

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

scala> val n:Any = null.asInstanceOf[String]
n: Any = null

1 个答案:

答案 0 :(得分:5)

语言规范明确表示此类型模式与null8.2 Type Patterns不匹配,强调我的):

  

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

     
      
  • 对类 C p.C T#C 的引用。此类型模式匹配给定类的任何非null实例
  •   

然而,我并不了解语言设计师。推理不匹配null