在 Scala 中,所有的值都有類型,包括數值和函數。下面這個圖表說明了類型繼承結構的子集。
Scala 類型繼承結構 (Scala Type Hierarchy)
Any
是所有類型的父類,也被叫成頂層類型。它定義了幾個最普通的方法,比如 equals
,hashCode
,toString
。Any
有兩個直接子類 AnyVal
和 AnyRef
。
AnyVal
代表值類型。一共有九種預定義值類型並且是非空的:Double
,Float
,Long
,Int
,Short
,Byte
,Char
,Unit
和 Boolean
。Unit
是一種值類型表示沒有意義的值。Unit
類型只有一個值,被聲明爲:()
。所有的函數都必須有返回值,所以有時 Unit
是一種有用的返回值。
AnyRef
代表引用類型。所有的非值類型都被定義爲引用類型。每個用戶自定義類型在 Scala 中都是 AnyRef
的子類。如果 Scala 被用在 Java 運行環境的上下文中,AnyRef
對應的就是 java.lang.Object
。
這裏的一個例子演示了像字符串,整數,字符,布爾值,和函數都是 Any
類型的子類。
val list: List[Any] = List(
"a string",
732, // an integer
'c', // a character
true, // a boolean value
() => "an anonymous function returning a string"
)
list.foreach(element => println(element))
例子定義了一個 list
常量,類型爲:List[Any]
。這個列表使用各種類型的元素進行初始化,但是所有的元素都是 scala.Any
的實例,所以你才能把它們加入到列表中。
這裏中上面的程序的輸出結果:
a string
732
c
true
<function>
類型轉換 (Type Casting)
值類型可以根據下圖的方向進行轉換:
例如:
val x: Long = 987654321
val y: Float = x // 9.8765434E8 (note that some precision is lost in this case)
val face: Char = '☺'
val number: Int = face // 9786
類型轉換是單向的,下面的例子將不能通過編譯:
val x: Long = 987654321
val y: Float = x //9.8765434E8
val z: Long = y // 不能通過編譯
你也可以將一個引用類型轉換成其子類型。這將會在之後討論。
什麼都沒有與空(Nothing and Null)
Nothing
是所有類型的子類型,也被叫做底層類型。沒有任何一個值的類型應該爲Nothing
。一個通常的使用是作爲一個非正常結束的信號,例如,拋出一個異常,程序手動退出,或者一個無限循環。(它是一個無法返回值的表達式的類型,或者沒有正常返回值的方法的類型)[2]
Null
是所有引用類型的子類(任何 AnyRef 子類)。它只有一個值被定義爲關鍵字 null
。Null
被提供給大部分其它 JVM 語言進行互通並且應該幾乎不在 Scala 代碼中使用。在之後我們將使用 null
。