1. 程式人生 > >Scala底層基類簡述

Scala底層基類簡述

ext pack bstr 有用 sca short 16px 之前 每一個

scala類庫文檔

Scala中,最頂端的兩個trait是Nothing和Null:

Nothing:

abstract final class Nothing extends Any

Nothing是其它任何類型的子類型(包括scala.Null)。Nothing類型沒有實例。盡管Nothing類型沒有實例,然而它在一些方面也是非常有用的。例如:

  1. Scala庫scala.collection.immutable.Nil定義了一個List[Nothing]值類型,因為scala中的list是協變(關於協變不在這裏詳述)的。 這使得scala.collection.immutable.Nil的List[T],T可以是任意類型。
  2. Nothing可以作為一個方法的返回值類型,這個方法不能正常的返回。一個例子就是:scala.sys中的error方法,它總是拋出一個異常

Null: Null是任何引用類型的子類型,它唯一的實例就是null引用。由於Null不是數值類型的子類型,故null不是數值類型的成員。舉例來說,就是不能將null賦值給一個scala.Int類型

abstract final class Null extends AnyRef

Any:Any類是個比較重要的類,其中定義了isInstanceOf和asInstanceOf等方法,以及equals、hashCode等對象的基本方法,Any類,有點像Java中的Object基類

abstract class Any

類Any是Scala類層次結構的根。Scala執行環境中的每一個類都直接或間接地從這個類繼承。
從Scala 2.10開始,可以直接繼承Any使用任何通用的特性(Any類中的方法,equals,asInstanceOf等)。一個普遍的特征,是一個trait繼承Any後,只有defs這個成員,並且不需要初始化。通用特性的主要用例是允許對值類(value class)的方法進行基本繼承。看下例:

trait Printable extends Any {
  def print(): Unit = println(this)
}
class Wrapper(val underlying: Int) extends
AnyVal with Printable val w = new Wrapper(3) w.print()

AnyRef:AnyRef類,增加了一些多線程的方法,比如wait、notify/notifyAll、synchronized等,也是屬於Java Object類的一部分

     Class AnyRef是所有引用類型的根類。除了值類型之外,所有類型都來自這個類。

class AnyRef extends Any


AnyVal:AnyVal是所有值類型的根類,它描述在底層主機系統中未實現的值。Value類是在Sc ala語言規範第12.2節中指定的。

標準的實現包括9個AnyVal子類型:

  • 數值類型:scala.Double, scala.Float, scala.Long, scala.Int, scala.Char, scala.Short, and scala.Byte
  • 非數值類型:scala.Unit 和 scala.Boolean

其它一些分組方式:

  • 子串類型:scala.Byte, scala.Short, and scala.Char.
  • 整數類型:包括子串類型和scala.Int以及scala.Long.
  • 浮點類型:scala.Float和scala.Double.

在Scala 2.10之前,AnyVal是一個封閉的特性。但是呢,從Scala 2.10開始,可以定義AnyVal的子類,稱為用戶定義的超值類,它是由編譯器專門處理的。適當定義的user value類提供了一種方法,通過在運行時避免對象分配,以及用靜態方法調用替換虛擬方法調用,從而提高用戶定義類型的性能。

用戶自定義的值類,如何避免對象分配呢?

  1. 必須有一個val參數,這是底層運行時表示,就是沒有這個底層不能識別為自定義值類,我理解。
  2. 可以定義defs,但不要vals、vars,或者嵌套traitss、class或者object。
  3. 一般來說,不要去繼承其他trait,只有AnyVal。
  4. 不能用於類型測試或模式匹配。
  5. 不能覆蓋equals或hashCode方法。

一個小實例,可以參考:

class Wrapper(val underlying: Int) extends AnyVal {
    def foo: Wrapper = new Wrapper(underlying * 19)
}

需要註意的是,用戶定義的值類是有限制的,並且在某些情況下,仍然必須在運行時分配一個值類實例。這些限制和環境在價值類和通用特性中得到了更詳細的解釋,這裏就不解釋了,可以參考這裏。

Scala底層基類簡述