scala中的option[T]、Any、Nothing、Null和Nil

fan_rockrock發表於2016-03-17

1、option[T]

option[T]主要是用來避免NullPointerException異常的(Option本身是一個容器)

// Java 裡 HashMap 的 get() 方法,如果找不到對應的 key 值,就會反回 null:
HashMap<String, String> myMap = new HashMap<String, String>();
myMap.put("key1", "value1");
String value1 = myMap.get("key1");  // 返回 "value1"
String value2 = myMap.get("key2");  // 返回 null
 
System.out.println(value1.length()); // 沒問題,答案是 6
System.out.println(value2.length()); // 拋 NullPointerException

//  Scala 可以不定義變數的型別,不過為了清楚些,我還是
// 把他顯示的定義上了
 
val myMap: Map[String, String] = Map("key1" -> "value")
val value1: Option[String] = myMap.get("key1")
val value2: Option[String] = myMap.get("key2")
 
println(value1) // Some("value1")
println(value2) // None

  Option的getOrElse方法

val option1: Option[Int] = Some(123)
val option2: Option[Int] = None
 
val value1 = option1.getOrElse(0) // 這個 value1 = 123
val value2 = option2.getOrElse(0) // 這個 value2 = 0</span>

2、Any

   Any是abstract類,它是Scala類繼承結構中最底層的。所有執行環境中的Scala類都是直接或間接繼承自Any這個類,它就是其它語言(.Net,Java等)中的Object。

3、Nothing

Nothing是所有型別的子類,Nothing沒有物件,但是可以用來定義型別。例如,如果一個方法丟擲異常,則異常的返回值型別就是Nothing(雖然不會返回) 

def get(index:Int):Int={
	if(x<0)
		throw new Exception(...)
	else
		....
}
if語句是表示式,有返回值,必然有返回值型別,如果x < 0,丟擲異常,返回值的型別為Nothing,Nothing也是Int的子類,所以,if表示式的返回型別為Int,get方法的返回值型別也為Int。

4、Null和Nil

Null是所有AnyRef的子類,在scala的型別系統中,AnyRef是Any的子類,同時Any子類的還有AnyVal。對應java值型別的所有型別都是AnyVal的子類。所以Null可以賦值給所有的引用型別(AnyRef),不能賦值給值型別,這個java的語義是相同的。 null是Null的唯一物件

Nil是一個空的List,定義為List[Nothing],根據List的定義List[+A],所有Nil是所有List[T]的子類。

相關文章