2016-11-28 54 views
1

value classes可用於實現類型安全而不需要拆箱。爲什麼scala value class#toString包含case class info?

我的印象是,在運行時這些類型/類將「不存在」,被視爲簡單類型(例如,在運行時,值類case class X(i: Int) extends AnyVal將是簡單的Int)。

但是,如果你調用一個值類實例的方法.toString它會打印出類似這樣:

scala> val myValueClass = X(3) 
myValueClass: X = 3 

scala> myValueClass.toString 
res5: String = X(3) 

,所以我猜編譯器包含了一些信息,畢竟?

回答

4

不是。編譯器創建一個靜態方法(在Scala中這對應於類的伴隨對象),該方法以int值作爲參數調用,以便模擬在值類類型對象上調用方法。

您的值類本身只存在於源代碼中。在編譯的字節碼中,使用了一個實際的基本int,並調用靜態方法,而不是使用實際方法調用的新對象實例。你可以閱讀更多關於這個機制here

1

價值類被設計成使得添加或移除extends AnyVal(如果法律)不應該改變計算的結果(除了甚至非情況值類具有equalshashCode等情況下類自動定義)。這要求在的一些的情況下它們能夠存活,例如,

def toString(x: Any) = x.toString 

toString(myValueClass) 

但你的問題的情況不是其中之一。

http://docs.scala-lang.org/sips/completed/value-classes.html#expansion-of-value-classes更精確地解釋了價值類是如何實現的,並且有助於瞭解它們在何種情況下生存下來,儘管一些細節可能自那以後發生了變化。

相關問題