Scala的類(lèi)層級(jí)
Scala里,每個(gè)類(lèi)都繼承自通用的名為Any的超類(lèi)。因?yàn)樗械念?lèi)都是Any的子類(lèi),所以定義在Any中的方法就是“共同的”方法:它們可以被任何對(duì)象調(diào)用。Scala還在層級(jí)的底端定義了一些類(lèi),如Null和Nothing,扮演通用的子類(lèi)。即,Any是所有其他類(lèi)的超類(lèi),Nothing是所有其他類(lèi)的子類(lèi)。
Any類(lèi)
層級(jí)的頂端是Any類(lèi),定義了下列方法:
final def ==(that: Any): Boolean
final def !=(that: Any): Boolean
def equals(that: Any): Boolean
def hashCode: Int
def toString: String
解釋?zhuān)阂驗(yàn)槊總€(gè)類(lèi)都繼承自Any,所以Scala程序里的每個(gè)對(duì)象都能用==、!=或equals比較,用hashCode做散列,以及用toString格式化。Any類(lèi)里的等號(hào)和不等號(hào)方法被聲明為final,因此他們不能再子類(lèi)里重寫(xiě)。實(shí)際上,==總是與equals相同,!=總是與equeal相反。因此,獨(dú)立的類(lèi)可以通過(guò)重寫(xiě)equals方法改變==或!=的意義。
根類(lèi)Any有兩個(gè)子類(lèi):AnyVal和AnyRef。
AnyVal是Scala里每個(gè)內(nèi)建值類(lèi)的父類(lèi)。有9個(gè)這樣的值類(lèi):Byte、Short、Char、Int、Long、Float、Double、Boolean和Unit。其中的前8個(gè)都對(duì)應(yīng)到Java的基本類(lèi)型。這些值類(lèi)都被定義為既是抽象的又是final的,不能使用new創(chuàng)造這些類(lèi)的實(shí)例。Unit被用作不返回任何結(jié)果的方法的結(jié)果類(lèi)型。Unit只有一個(gè)實(shí)例值,寫(xiě)成()。
值類(lèi)的空間是平坦的;所有的值類(lèi)都是scala.AnyVal的子類(lèi)型,但是它們不是其他類(lèi)的子類(lèi)。但是不同的值類(lèi)類(lèi)型之間可以隱式地互相轉(zhuǎn)換。例如,需要的時(shí)候,類(lèi)scala.Int的實(shí)例可以通過(guò)隱式轉(zhuǎn)換放寬到類(lèi)scala.Long的實(shí)例;Int支持min、max、until、to、abs等操作,其實(shí)是從類(lèi)Int隱式轉(zhuǎn)換到scala.runtime.RichInt的。
AnyRef類(lèi)是Scala里所有引用類(lèi)(reference class)的基類(lèi)。它其實(shí)是Java平臺(tái)上java.lang.Object類(lèi)的別名。因此Java里寫(xiě)的類(lèi)和Scala里寫(xiě)的都繼承自AnyRef。
Scala類(lèi)與Java類(lèi)的不同在于它們還繼承自一個(gè)名為ScalaObject的特別記號(hào)特質(zhì)。是想要通過(guò)ScalaObject包含的Scala編譯器定義和實(shí)現(xiàn)的方法讓Scala程序的執(zhí)行更高效。

底層類(lèi)型
scala.Null和scala.Nothing是用統(tǒng)一的方式處理Scala面向?qū)ο箢?lèi)型系統(tǒng)的某些“邊界情況”的特殊類(lèi)型。
Null類(lèi)是null引用對(duì)象的類(lèi)型,它是每個(gè)引用類(lèi)(繼承自AnyRef的類(lèi))的子類(lèi)。Null不兼容值類(lèi)型。
Nothing類(lèi)型在Scala的類(lèi)層級(jí)的最低端;它是任何其他類(lèi)型的子類(lèi)型。然而,根本沒(méi)有這個(gè)類(lèi)型的任何值。Nothing的一個(gè)用處是它標(biāo)明了不正常的終止。
例如:
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的返回類(lèi)型是Nothing,告訴用戶(hù),方法不是正常返回的。因?yàn)镹othing的任何其他類(lèi)型的子類(lèi),所以你可以非常靈活地使用像error這樣的方法。
轉(zhuǎn)載請(qǐng)注明作者Jason Ding及其出處
GitCafe博客主頁(yè)(http://jasonding1354.gitcafe.io/)
Github博客主頁(yè)(http://jasonding1354.github.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
簡(jiǎn)書(shū)主頁(yè)(http://www.lxweimin.com/users/2bd9b48f6ea8/latest_articles)
百度搜索jasonding1354進(jìn)入我的博客主頁(yè)