1. 程式人生 > >Scala中的None,Nothing,Null,Nil

Scala中的None,Nothing,Null,Nil

if表達式 ava 完全 body int con log any nil

Scala中的None,Nothing,Null,Nil

在scala中這四個類型名稱很類似,作用確實完全不同的。

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  
}  


獲得Option後,可以使用get獲得包含的值,或者使用getOrElse獲得默認值如果isEmpty為true。

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

Scala中的None,Nothing,Null,Nil