Scala中有四種空的類型None,Nothing,Null,Nil
None是一個object,是Option的子類型。
case object None extends Option[Nothing] {
def isEmpty = true
def get = throw new NoSuchElementException("None.get")
}
scala推薦在可能返回空的方法使用Option[X]作為返回類型。如果有值就返回Some[X]. Some也是Option的子類),否則返回None,例如
def get(key: A): Option[B] = {
if (contains(key))
Some(getValue(key))
else
None
}
Null是所有AnyRef的子類,在scala的類型系統中,AnyRef是Any的子類,同時Any子類的還有AnyVal。對應java值類型的所有類型都是AnyVal的子類。所以Null可以賦值給所有的引用類型(AnyRef),不能賦值給值類型,這個java的語義是相同的。 null是Null的唯一對象。
Nothing是所有類型的子類,也是Null的子類。Nothing沒有對象,但是可以用來定義類型。例如,如果一個方法拋出異常,則異常的返回值類型就是Nothing(雖然不會返回)
def get(index:Int):Int = {
if(x < 0) throw new Exception(...)
else ....
}
if語句是表達式,有返回值,必然有返回值類型,如果x < 0,拋出異常,返回值的類型為Nothing,Nothing也是Int的子類,所以,if表達式的返回類型為Int,get方法的返回值類型也為Int。
Nil是一個空的List,定義為List[Nothing],根據List的定義List[+A],所有Nil是所有List[T]的子類。