国产gaysexchina男同gay,japanrcep老熟妇乱子伦视频,吃奶呻吟打开双腿做受动态图,成人色网站,国产av一区二区三区最新精品

Scala 的類(lèi)層次關(guān)系

2018-08-12 21:25 更新

Scala 的類(lèi)層次關(guān)系

前面我們介紹了 Scala 的類(lèi)的繼承,本篇我們介紹 Scala 語(yǔ)言自身定義的類(lèi)的層次關(guān)系,在 Scala 中,所有的類(lèi)都有一個(gè)公共的基類(lèi)稱(chēng)為 Any,此外還定義了所有類(lèi)的子類(lèi) Nothing,下面的圖給出的 Scala定義的類(lèi)層次關(guān)系的一個(gè)概要:

由于所有的類(lèi)都繼承自 Any,因此 Scala 中的對(duì)象都可以使用==,!=,或 equals 來(lái)比較,使用##或 hashCode 給出 hash 值,使用 toString 轉(zhuǎn)為字符串。Any 的==和!=定位為 fianl,因此不可以被子類(lèi)重載。==實(shí)際上和 equals 等價(jià),!=和 equals 的否定形式等價(jià),因此重載 equals 可以修改==和!=的定義。

根類(lèi) Any 有兩個(gè)子類(lèi):AnyVal 和 AnyRef。AnyVal 是 Scala 里每個(gè)內(nèi)建值類(lèi)型的父類(lèi)。有九個(gè)這樣的值類(lèi)型:Byte,Short,Char,Int,Long,F(xiàn)loat,Double,Boolean 和 Unit。其中的前八個(gè)對(duì)應(yīng)到 Java 的基本數(shù)值類(lèi)型,它們的值在運(yùn)行時(shí)表示成 Java 的類(lèi)型。Scala 里這些類(lèi)的實(shí)例都寫(xiě)成字面量。例如,42 是 Int 的實(shí)例,’x’是 Char 的實(shí)例,false 是 Boolean 的實(shí)例。值類(lèi)型都被定義為即是抽象的又是 final 的,你不能使用 new 創(chuàng)造這些類(lèi)的實(shí)例。

scala> new Int
<console>:8: error: class Int is abstract; cannot be instantiated
              new Int
              ^
scala> 

另一個(gè)值類(lèi),Unit,大約對(duì)應(yīng)于 Java 的 void 類(lèi)型;被用作不返回任何有趣結(jié)果的方法的結(jié)果類(lèi)型。 Unit 只有一個(gè)實(shí)例值,被寫(xiě)作().

值類(lèi)支持作為方法的通用的數(shù)學(xué)和布爾操作符。例如,Int 有名為+和*的方法,Boolean 有名為||和&&的方法。值類(lèi)也從類(lèi) Any 繼承所有的方法。你可以在解釋器里測(cè)試:

scala> 42 toString
res3: String = 42
scala> 42.hashCode
res6: Int = 42

可以看到 Scala 的值類(lèi)型之間的關(guān)系是扁平的,所有的值類(lèi)都是 scala.AnyVal 的子類(lèi)型,但是它們不是互相的子類(lèi)。代之以它們不同的值類(lèi)類(lèi)型之間可以隱式地互相轉(zhuǎn)換。例如,需要的時(shí)候,類(lèi) scala.Int 的實(shí)例可以自動(dòng)放寬(通過(guò)隱式轉(zhuǎn)換)到類(lèi) scala.Long 的實(shí)例。隱式轉(zhuǎn)換還用來(lái)為值類(lèi)型添加更多的功能。例如,類(lèi)型 Int 支持以下所有的操作:

scala> 42 max 43
res0: Int = 43
scala> 42 min 43
res1: Int = 42
scala> 1 until 5
res2: scala.collection.immutable.Range = Range(1, 2, 3, 4)
scala> 1 to 5 
res3: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)
scala> 3.abs
res4: Int = 3
scala> (-3).abs
res5: Int = 3

這里解釋其工作原理:方法 min,max,until,to 和 abs 都定義在類(lèi) scala.runtime.RichInt 里,并且有一個(gè)從類(lèi) Int 到 RichInt 的隱式轉(zhuǎn)換。當(dāng)你在 Int 上調(diào)用沒(méi)有定義在 Int 上但定義在 RichInt 上的方法時(shí),這個(gè)轉(zhuǎn)換就被應(yīng)用了。

類(lèi) Any 的另一個(gè)子類(lèi)是類(lèi) AnyRef。這個(gè)是 Scala 里所有引用類(lèi)的基類(lèi)。正如前面提到的,在 Java 平臺(tái)上 AnyRef 實(shí)際就是類(lèi) java.lang.Object 的別名。因此 Java 里寫(xiě)的類(lèi)和 Scala 里寫(xiě)的都繼承自 AnyRef。如此說(shuō)來(lái),你可以認(rèn)為 java.lang.Object 是 Java 平臺(tái)上實(shí)現(xiàn) AnyRef 的方式。因此,盡管你可以在 Java 平臺(tái)上的 Scala 程序里交換使用 Object 和 AnyRef,推薦的風(fēng)格是在任何地方都只使用 AnyRef。

Scala 類(lèi)與 Java 類(lèi)不同在于它們還繼承自一個(gè)名為 ScalaObject 的特別的 Marker Trait(Trait 我們?cè)诤竺嬖龠M(jìn)一步解釋?zhuān)?/p>

以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)