scala中None Null Nothing 和 Nil的區別
[java] view plain copy
print?
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] view plain copy
print?
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(雖然不會返回)
[java] view plain copy
print?
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]的子類。