任何精通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
)
答案 0 :(得分:5)
语言规范明确表示此类型模式与null
(8.2 Type Patterns不匹配,强调我的):
类型模式由类型,类型变量和通配符组成。类型模式 T 具有以下形式之一:
- 对类 C , p.C 或 T#C 的引用。此类型模式匹配给定类的任何非null实例。
然而,我并不了解语言设计师。推理不匹配null
。