Scala中的Option、None、Nothing、Null和Nil

在Scala中有几个容易混淆的类型,像是None、Nothing、Null、Nil等。在实际编程中又经常会遇到。要有一个清楚区分,这边文章就简单做个总结。

首先可以参考一下scala的继承层次树:
scala中的Null

可以看到,在Scala中,所有类型的父类是Any,其声明了isInstanceOf、asInstanceOf、equal、hashCode、toString等方法。
Any有两个直接子类:AnyVal和AnyRef。
AnyVal是所有值类型的父类,没有追加任何方法,只是所有值类型的一个标记。
AnyRef是所有引用类型的父类,追加了来自Object类的wait、notify等监听方法。
所有Scala类都实现了ScalaObject这个标记接口,该接口只是一个标记,没有定义任何方法。

在这个继承层次树中的底端,有两个特殊的类型:Null和Nothing
Null只有一个实例,就是null值。我们可以将null赋值给任何引用类型,但不能赋值给值类型。
Nothing是任意类型的子类。Nothing类没有实例,但可以表示任意类型。所以经常用于泛型结构,如空列表Nil的类型就是List[Nothing],它是List[T]的子类型,T可以是任何类。

接下来对其它的几个类型做说明:

Unit类型相当于java中的void,其只有一个值,就是()。Unit只是AnyVal的子类,但编译器允许任何值被替换成()

None类型是Option类的子类,代表不存在的值(non-existent)

Some[A] 类型也是Option类的子类,代表类型A存在的值。

Option代表一个可选的值。既可以是Some[A]的一个实例,也可以是None,即不存在。scala推荐在可能返回空对象的函数中,声明返回值为Option[A]。Option类型中也提供isEmpty,get,getOrElse等方法来操作和判断。

Nil是一个空的List,其相当于List[Nothing]。

如果本文有出于我个人理解或表达的错误,还望指正。
如果本文有涉及到版权、知识产权的问题,请及时与我联系。