Scala 之旅(TOUR OF SCALA)——統一類型(UNIFIED TYPES)

在 Scala 中,所有的值都有類型,包括數值和函數。下面這個圖表說明了類型繼承結構的子集。

unified-types-diagram

Scala 類型繼承結構 (Scala Type Hierarchy)

Any 是所有類型的父類,也被叫成頂層類型。它定義了幾個最普通的方法,比如 equalshashCodetoStringAny 有兩個直接子類 AnyValAnyRef

AnyVal 代表值類型。一共有九種預定義值類型並且是非空的:DoubleFloatLongIntShortByteCharUnitBooleanUnit 是一種值類型表示沒有意義的值。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)

值類型可以根據下圖的方向進行轉換:

type-casting-diagram

例如:

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 子類)。它只有一個值被定義爲關鍵字 nullNull 被提供給大部分其它 JVM 語言進行互通並且應該幾乎不在 Scala 代碼中使用。在之後我們將使用 null

下一篇:Scala之旅(TOUR OF SCALA)——類(CLASSES)

發佈了23 篇原創文章 · 獲贊 20 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章