Scala中的None,Nothing,Null,Nil

在scala中這四個類型名稱很相似,做用確實徹底不一樣的。 

None是一個object,是Option的子類型,定義以下 
html

case object None extends Option[Nothing] {
  def isEmpty = true
  def get = throw new NoSuchElementException("None.get")
}


scala推薦在可能返回空的方法使用Option[X]做爲返回類型。若是有值就返回Some[x](Some也是Option的子類),不然返回None,例如 
java

def get(key: A): Option[B] = {
	if (contains(key))
		Some(getValue(key))
	else
		None
}


得到Option後,能夠使用get得到包含的值,或者使用getOrElse得到默認值若是isEmpty爲true。 

Null是全部AnyRef的子類,在scala的類型系統中,AnyRef是Any的子類,同時Any子類的還有AnyVal。對應java值類型的全部類型都是AnyVal的子類。因此Null能夠賦值給全部的引用類型(AnyRef),不能賦值給值類型,這個java的語義是相同的。 null是Null的惟一對象。 

Nothing是全部類型的子類,也是Null的子類。Nothing沒有對象,可是能夠用來定義類型。例如,若是一個方法拋出異常,則異常的返回值類型就是Nothing(雖然不會返回) 
spa

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]的子類。scala

參考:Scala中的None,Nothing,Null,Nilcode

相關文章
相關標籤/搜索