0

以下是 Scala 中的有效语句:

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

scala> var x: Option[Int] = None
x: Option[Int] = None

以下内容无效:

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

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

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

scala> val x: Option[Int] = null
x: Option[Int] = null

如果我然后尝试对选项进行模式匹配(例如,如下所示),我会遇到我没想到的失败 - 为什么编译器不通过拒绝 null 的分配来保护我免受这种情况的影响?

x match {
  case Some(y) => println("Number: ", y)
  case None => println("No number")
}
4

2 回答 2

7

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

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

您不能分配给3Option因为它不是(显然)3的子类的值。Option

于 2013-08-24T06:02:31.440 回答
0

您可能想问的问题的答案是这样的:

惯用的 Scala 永远不会使用null. 空引用的存在纯粹是为了与 Java 和其他 JVM 语言的互操作性。如果您null在 Scala 代码中看到它,它应该会立即引起审查。你永远不会null错误地使用,所以编译器警告是不必要的。正如 Daniel Sobral 的回答和评论中所指出的,编译器无法提供针对null.

于 2013-08-24T13:43:38.230 回答