W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
前面我們介紹了 Scala 的類的繼承,本篇我們介紹 Scala 語言自身定義的類的層次關系,在 Scala 中,所有的類都有一個公共的基類稱為 Any,此外還定義了所有類的子類 Nothing,下面的圖給出的 Scala定義的類層次關系的一個概要:
由于所有的類都繼承自 Any,因此 Scala 中的對象都可以使用==,!=,或 equals 來比較,使用##或 hashCode 給出 hash 值,使用 toString 轉為字符串。Any 的==和!=定位為 fianl,因此不可以被子類重載。==實際上和 equals 等價,!=和 equals 的否定形式等價,因此重載 equals 可以修改==和!=的定義。
根類 Any 有兩個子類:AnyVal 和 AnyRef。AnyVal 是 Scala 里每個內建值類型的父類。有九個這樣的值類型:Byte,Short,Char,Int,Long,F(xiàn)loat,Double,Boolean 和 Unit。其中的前八個對應到 Java 的基本數值類型,它們的值在運行時表示成 Java 的類型。Scala 里這些類的實例都寫成字面量。例如,42 是 Int 的實例,’x’是 Char 的實例,false 是 Boolean 的實例。值類型都被定義為即是抽象的又是 final 的,你不能使用 new 創(chuàng)造這些類的實例。
scala> new Int
<console>:8: error: class Int is abstract; cannot be instantiated
new Int
^
scala>
另一個值類,Unit,大約對應于 Java 的 void 類型;被用作不返回任何有趣結果的方法的結果類型。 Unit 只有一個實例值,被寫作().
值類支持作為方法的通用的數學和布爾操作符。例如,Int 有名為+和*的方法,Boolean 有名為||和&&的方法。值類也從類 Any 繼承所有的方法。你可以在解釋器里測試:
scala> 42 toString
res3: String = 42
scala> 42.hashCode
res6: Int = 42
可以看到 Scala 的值類型之間的關系是扁平的,所有的值類都是 scala.AnyVal 的子類型,但是它們不是互相的子類。代之以它們不同的值類類型之間可以隱式地互相轉換。例如,需要的時候,類 scala.Int 的實例可以自動放寬(通過隱式轉換)到類 scala.Long 的實例。隱式轉換還用來為值類型添加更多的功能。例如,類型 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 都定義在類 scala.runtime.RichInt 里,并且有一個從類 Int 到 RichInt 的隱式轉換。當你在 Int 上調用沒有定義在 Int 上但定義在 RichInt 上的方法時,這個轉換就被應用了。
類 Any 的另一個子類是類 AnyRef。這個是 Scala 里所有引用類的基類。正如前面提到的,在 Java 平臺上 AnyRef 實際就是類 java.lang.Object 的別名。因此 Java 里寫的類和 Scala 里寫的都繼承自 AnyRef。如此說來,你可以認為 java.lang.Object 是 Java 平臺上實現(xiàn) AnyRef 的方式。因此,盡管你可以在 Java 平臺上的 Scala 程序里交換使用 Object 和 AnyRef,推薦的風格是在任何地方都只使用 AnyRef。
Scala 類與 Java 類不同在于它們還繼承自一個名為 ScalaObject 的特別的 Marker Trait(Trait 我們在后面再進一步解釋)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: