隱式轉換(Implicit Conversion)

implicit conversion

Latent (Implicit) vs Manifest (Explicit) Typing
隱式類型和顯式類型,區分的關鍵點為是否要在源碼中聲明類型:隱式類型不需要,顯式類型需要。

注意,值類的空間是扁平的;所有的值類都是scala.AnyVal的子類型,但是它們不是互相的子類。代之以它們不同的值類類型之間可以隱式地互相轉換。例如,需要的時候,類scala.Int的實例可以自動放寬(通過隱式轉換)到類scala.Long的實例。

正如5.9節中提到過的,隱式轉換還用來為值類型添加更多的功能。例如,類型Int支持以下所有的操作:

scala> 42 max 43
res4: Int = 43
scala> 42 min 43
res5: Int = 42
scala> 1 until 5
res6: Range = Range(1, 2, 3, 4)
scala> 1 to 5
res7: Range.Inclusive = Range(1, 2, 3, 4, 5)
scala> 3.abs
res8: Int = 3
scala> (-3).abs
res9: Int = 3

這裡解釋其工作原理:方法min,max,until,to和abs都定義在類scala.runtime.RichInt裡,並且有一個從類Int到RichInt的隱式轉換。當你在Int上調用沒有定義在Int上但定義在RichInt上的方法時,這個轉換就被應用了。類似的「助推器類」和隱式轉換存在於其它的值類。


隱式轉換:比動態類型更強大?
Comments