scala隐式详解

定义

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

在下面的代码里,我们定义了一个样例类,然后定义两个排序方法sortBy1sortBy2,从作用上讲两者是一样的:将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
发布了85 篇原创文章 · 获赞 21 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_37275456/article/details/101641408