在 Scala 中,所有值都有類型,包括數字值和函式。下方的圖表說明了類型階層的子集。
Scala 類型階層
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[Any]
類型的值 list
。清單使用各種類型的元素初始化,但每個元素都是 scala.Any
的實例,所以你可以將它們新增到清單中。
以下是程式碼的輸出
a string
732
c
true
<function>
類型轉換
例如
val x: Long = 987654321
val y: Float = x.toFloat // 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.toFloat // 9.8765434E8
val z: Long = y // Does not conform
你也可以將參考類型轉換為子類型。這會在後面的導覽中說明。
Nothing 和 Null
Nothing
是所有類型的子類型,也稱為底層類型。沒有任何值具有 Nothing
類型。常見的用法是表示非終止,例如拋出的例外、程式退出或無限迴圈(即它是不會評估為值的表達式或不會正常返回的方法的類型)。
Null
是所有參考類型的子類型(即 AnyRef 的任何子類型)。它有一個由關鍵字文字 null
識別的單一值。提供 Null
主要用於與其他 JVM 語言的互操作性,幾乎不應在 Scala 程式碼中使用。我們將在後面的導覽中介紹 null
的替代方案。