定义
使用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