Scala的類層級
Scala里,每個類都繼承自通用的名為Any的超類。因為所有的類都是Any的子類,所以定義在Any中的方法就是“共同的”方法:它們可以被任何對象調用。Scala還在層級的底端定義了一些類,如Null和Nothing,扮演通用的子類。即,Any是所有其他類的超類,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格式化。Any類里的等號和不等號方法被聲明為final,因此他們不能再子類里重寫。實際上,==總是與equals相同,!=總是與equeal相反。因此,獨立的類可以通過重寫equals方法改變==或!=的意義。
根類Any有兩個子類:AnyVal和AnyRef。
AnyVal是Scala里每個內建值類的父類。有9個這樣的值類:Byte、Short、Char、Int、Long、Float、Double、Boolean和Unit。其中的前8個都對應到Java的基本類型。這些值類都被定義為既是抽象的又是final的,不能使用new創造這些類的實例。Unit被用作不返回任何結果的方法的結果類型。Unit只有一個實例值,寫成()。
值類的空間是平坦的;所有的值類都是scala.AnyVal的子類型,但是它們不是其他類的子類。但是不同的值類類型之間可以隱式地互相轉換。例如,需要的時候,類scala.Int的實例可以通過隱式轉換放寬到類scala.Long的實例;Int支持min、max、until、to、abs等操作,其實是從類Int隱式轉換到scala.runtime.RichInt的。
AnyRef類是Scala里所有引用類(reference class)的基類。它其實是Java平臺上java.lang.Object類的別名。因此Java里寫的類和Scala里寫的都繼承自AnyRef。
Scala類與Java類的不同在于它們還繼承自一個名為ScalaObject的特別記號特質。是想要通過ScalaObject包含的Scala編譯器定義和實現的方法讓Scala程序的執行更高效。

底層類型
scala.Null和scala.Nothing是用統一的方式處理Scala面向對象類型系統的某些“邊界情況”的特殊類型。
Null類是null引用對象的類型,它是每個引用類(繼承自AnyRef的類)的子類。Null不兼容值類型。
Nothing類型在Scala的類層級的最低端;它是任何其他類型的子類型。然而,根本沒有這個類型的任何值。Nothing的一個用處是它標明了不正常的終止。
例如:
def error(message: String): Nothing =
throw new RuntimeException(message)
def divide(x: Int, y: Int): Int =
if(y != 0) x / y
else error("Can't divide by zero")
上面的例子中,error的返回類型是Nothing,告訴用戶,方法不是正常返回的。因為Nothing的任何其他類型的子類,所以你可以非常靈活地使用像error這樣的方法。
轉載請注明作者Jason Ding及其出處
GitCafe博客主頁(http://jasonding1354.gitcafe.io/)
Github博客主頁(http://jasonding1354.github.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
簡書主頁(http://www.lxweimin.com/users/2bd9b48f6ea8/latest_articles)
百度搜索jasonding1354進入我的博客主頁