定義
使用implicit
關鍵字
implicit val rate: Float = 0.05F
implicit def float2Int(float: Float) = {
float.toInt
}
隱式參數
調用方法時,如果未輸入隱式參數且代碼所處作用域中存在類型兼容的隱式值,該值會從作用域中調出並被使用,反之,系統將會拋出編譯器錯誤。
def calcTax(amount: Float)(implicit rate: Float): Float = amount * rate
調用該方法時,系統會將代碼所在局部作用域中的某一隱式值傳入此方法:
implicit val currentTaxRate = 0.08F
...
val tax = calcTax(50000F) // 4000.0
implicitly
在下面的代碼裏,我們定義了一個樣例類,然後定義兩個排序方法sortBy1
和sortBy2
,從作用上講兩者是一樣的:將list中的A對象映射成B對象,然後對按Ordering[B]
規則對list排序。
import math.Ordering
case class MyList[A](list: List[A]) {
def sortBy1[B](f: A => B)(implicit ord: Ordering[B]): List[A] =
list.sortBy(f)(ord)
def sortBy2[B : Ordering](f: A => B): List[A] =
list.sortBy(f)(implicitly[Ordering[B]])
}
sortBy2
是對sortBy1
的簡寫。在sortBy1中要傳入一個隱式參數,然後在方法體內要調用。然後sortBy2中省略了參數的傳入,但是要對B類型進行約束。因爲不是所有的B類型可以生成Ordering[B]。然後由於沒有顯示的參數定義,所以不能在調用的時候向sortBy1一樣傳一個ord參數。但是可以用implicitly關鍵字來搜索和轉換一個。
scala> implicitly[Ordering[String]]
res5: Ordering[String] = scala.math.Ordering$String$@7ba93755