Scala中所有的數據都有相應的類型,包括數值型數據和函數。下圖展示了一部分類型層次
Scala 類型層次
Any
是所有類型的父類,相當於Java中的Object。Any
定義了一些通用的方法,比如 equals, hashCode, toString。 Any
有倆直接子類: AnyVal
和 AnyRef
。
AnyVal
表示“字面量”類型。Scala中有9種預定義的字面量類型並且它們是不爲NULL的,分別是:Double, Float, Long, Int, Short, Byte, Char, Unit, Boolean(是不是和Java中的包裝類很像?)。Unit 是一種數值類型,表示不包含任何有意義的信息。Unit只有一個實例,字面上可以用()來聲明。Scala規定所有的函數都必須返回一個值,因此在某些確實不需要返回的場合下,Unit就派上用場了。
Unit的聲明:
scala> var a = ();
a: Unit = ()
AnyRef
表示引用類型。 所有非值類型都被定義成引用類型。Scala中,每個用戶自定義的類型都是AnyRef
的子類。
類型轉換
數值類型可以通過下面的方式進行轉換:
For example:
val x: Long = 987654321
val y: Float = x // 9.8765434E8 (注意這裏會丟失一些精度)
val face: Char = '☺'
val number: Int = face // 9786
類型轉換是單向的,下面的無法通過編譯:
val x: Long = 987654321
val y: Float = x // 9.8765434E8
val z: Long = y // 報錯!
Nothing和Null類型
Nothing
是所有類型的子類,處於Scala的類層級的最低端。沒有哪個數據的類型是Nothing
。那爲啥還會有這個類型呢?Nothing
通常用來表示程序非正常終止,比如拋出異常、程序退出或無限循環。
Null
是所有引用類型的子類。它用字面量null
來唯一表示。Null
通常是用來和其他JVM語言進行交互的,如果單獨在Scala中,基本不用。