为什么我可以为选项分配null?

Dav*_*ill 0 scala

以下是Scala中的有效语句:

scala> var x: Option[Int] = Some(3)
x: Option[Int] = Some(3)

scala> var x: Option[Int] = None
x: Option[Int] = None
Run Code Online (Sandbox Code Playgroud)

以下内容无效:

scala> var x: Option[Int] = 3
<console>:7: error: type mismatch;
 found   : Int(3)
 required: Option[Int]
       var x: Option[Int] = 3
Run Code Online (Sandbox Code Playgroud)

到目前为止,这些例子对我有意义; Option [T]类型的值可以是Some [T]或None类型,因此编译器会阻止您分配既不是类型的值.

但是,Scala编译器似乎接受了这个:

scala> val x: Option[Int] = null
x: Option[Int] = null
Run Code Online (Sandbox Code Playgroud)

如果我然后尝试在选项上进行模式匹配(例如如下),我会得到我没想到的失败 - 为什么编译器不通过拒绝null的赋值来保护我?

x match {
  case Some(y) => println("Number: ", y)
  case None => println("No number")
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*ral 7

如果查看Scala类层次结构,您将看到所有派生的类AnyRef都是超类Null,并且可以为任何此类超类赋值null.由于Option是一个这样的类,您可以分配Null给它.

请注意,两者SomeNone.type(即None对象的单例类型)都是超类Null,因此它们null是任何一个的有效值.

你不能分配3,Option因为3它不是一个子类的值Option(显然).