きくらげ観察日記

好きなことを、適当に。

Null, Nothing, Any

Any

Scalaでは全てのクラスはAnyのサブクラスとなります。そのため、任意のAny型の変数には任意の型の値を代入することができます。
Anyのサブクラスとして、任意のプリミティブな値を表す型であるAnyValと、任意の参照型を表すAnyRefの2種類が存在します。

Null

Nullは全ての参照型のサブクラスであり、単一の値nullのみを持ちます。そのため、任意の参照型(AnyRefのサブクラス)の変数には、nullを代入することができます。

Nothing

Nothingは全てのクラスのサブクラスのサブクラスであり、Nothing型の値は存在しません。HaskellでいうData.Void.Voidに近いものですね。NullやUnitがシングルトンを表すのに対し、Nothingは空集合を意味します。*1

親子関係としては

Nothing <: Int, Double, Boolean, ... <: AnyVal <: Any
Nothing <: Null <: 任意のクラス <: AnyRef <: Any

というようになります。

その他よく混同されるものたち

Unit

Unitは単一の値()を持つ型です。これは要素数0のタプルを意味します。

Nil

NilはList[T]のインスタンスで、空リストを表します。

None

NoneはOption[T]のインスタンスで、これは値が無いことを意味します。HaskellでいうNothingですね。値が存在しないという状況があり得るかどうかを型レベルで指定するために存在しますが、nullの存在のためにゴミみたいなコードを書くと全く意味がなくなってしまいます。
Nullの存在はあくまでJavaとの互換性のためにある(と思っている)ので、Scalaでコードを書く場合はNullは使わずに、「値が無い」場合を考慮しないといけない場合は素直にOption[T]を使いましょう。


Scalaスケーラブルプログラミング第2版

Scalaスケーラブルプログラミング第2版

関数型オブジェクト指向AI プログラミング―Scala による人工知能の実装

関数型オブジェクト指向AI プログラミング―Scala による人工知能の実装

*1:とは言っても、実際はエラーを発生させる可能性もあるので空集合ではなく{_|_}とかになるのかもしれませんが、意味論に関しては何も知らないので詳しいことは分かりません