任何精通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)
)
?
语言规范明确指出这种类型模式不匹配null(8.2 Type Patterns,强调我的):
类型模式由类型,类型变量和通配符组成.类型模式T具有以下形式之一:
- 对C,pC或T#C类的引用.此类型模式匹配给定类的任何非null实例.
但是,我不知道语言设计者的背后推理不匹配null.