天天看點

Scala的類層級講解Scala的類層級Any類AnyVal, Unit和AnyRefscala.Null和scala.Nothing

Scala的類層級

Scala裡,每個類都繼承自通用的名為

Any

的超類。

因為所有的類都是Any的子類,是以定義在Any中的方法就是“共同的”方法:它們可以被任何對象調用。

Scala還在層級的底端定義了一些類,如

Null

Nothing

,扮演通用的子類。

即,Any是所有其他類的超類,Nothing是所有其他類的子類。

類層級圖如下:

Scala的類層級講解Scala的類層級Any類AnyVal, Unit和AnyRefscala.Null和scala.Nothing

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的一個用處是它标明了不正常的終止。