Scala的類層級
Scala裡,每個類都繼承自通用的名為
Any
的超類。
因為所有的類都是Any的子類,是以定義在Any中的方法就是“共同的”方法:它們可以被任何對象調用。
Scala還在層級的底端定義了一些類,如
Null
和
Nothing
,扮演通用的子類。
即,Any是所有其他類的超類,Nothing是所有其他類的子類。
類層級圖如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZlBnauIjZmNDNyYjZjFmMjRjY0I2NlZjMmlDZkRGNiZGMmVGMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.jpeg)
Any類
層級的頂端是Any類,定義了下列方法:
final def ==(that: Any): Boolean
final def !=(that: Any): Boolean
def equals(that: Any): Boolean
def hashCode: Int
def toString: String
解釋:因為每個類都繼承自Any,是以Scala程式裡的每個對象都能用==、!=或equals比較,用hashCode做散列,以及用toString格式化。
AnyVal, Unit和AnyRef
根類Any有兩個子類:AnyVal和AnyRef。
AnyVal
AnyVal
是Scala裡每個内建++值類++的父類。有9個這樣的值類:Byte、Short、Char、Int、Long、Float、Double、Boolean和Unit。
Unit
Unit
隻有一個執行個體值,寫成()。
所有的值類都是scala.AnyVal的子類型,但是它們不是其他類的子類。但是不同的值類類型之間可以隐式地互相轉換。
例如,需要的時候,類scala.Int的執行個體可以通過隐式轉換放寬到類scala.Long的執行個體;Int支援min、max、until、to、abs等操作,其實是從類Int隐式轉換到scala.runtime.RichInt的。
AnyRef
AnyRef
類是Scala裡所有引用類(reference class)的基類。
++它其實是Java平台上java.lang.Object類的别名++。是以Java裡寫的類和Scala裡寫的都繼承自AnyRef。
Scala類與Java類的不同在于它們還繼承自一個名為ScalaObject的特質。目的是要通過ScalaObject包含的Scala編譯器定義和實作的方法讓Scala程式的執行更高效。
scala.Null和scala.Nothing
Scala是用統一的方式處理Scala靜态類型系統的某些“邊界情況”的特殊類型。
Null
Null
類是null引用對象的類型,它是每個引用類(繼承自AnyRef的類)的子類。Null不相容值類型。
Nothing
Nothing
類型在Scala的類層級的最低端;它是任何其他類型的子類型。然而,根本沒有這個類型的任何值。Nothing的一個用處是它标明了不正常的終止。