2、Scala 隐式转换和隐式参数
隐式转换和隐式参数是 Scala 中两个非常强大的功能,利用隐式转换和隐式参数,你可以提 供优雅的类库,
对类库的使用者隐匿掉那些枯燥乏味的细节。
隐式的对类的方法进行增强,丰富现有类库的功能
是指那种以 implicit 关键字声明的带有单个参数的函数。
可以通过::implicit -v 这个命令显示所有做隐式转换的类。
2.1、Scala 隐式转换探讨
现在我们来考虑一个问题: 之前讲过:
1 to 10 其实可以写成 1.to(10)
那其实就是表示:1 是一个 Int 类型的变量,所以证明 Int 类中会有一个 to 的方法 但事实上,我们在 Int 类型中根本就没有寻找 to 方法 那也就是说对一个 Int 类型的变量 1 调用 Int 类型不存在的一个方法,这怎么还能正常运行 呢?
原因就是隐式转换
看一个最简单的隐式转换的例子:
那我们首先来看一下隐式参数:
package com.mazh.scala.day3
object ImplicitParamTest {
// 正常的普通方法
def add(x:Int, y:Int) = x + y
// 柯里化的方法
def add2(x:Int)(y:Int) = x + y
def add3(x:Int)(y:Int = 10) = x + y
// 如果变成下面这种形式:
def add4(x:Int)(implicit y:Int = 10) = x + y
def main(args: Array[String]): Unit = {
println ( add (2,3))
// 不能只传一个参数取使用,必须要传入两个参数
println ( add2 (2)(3))
println ( add 3 (2)())
// 调用带隐式参数的函数
println ( add 4 (2))
}
}
在上面的代码中,可以看出来,如果对 add2 方法的第二个参数,做了隐式声明,发现之前 需要传入两个参数才能执行的方法 add2 就可以只传入一个参数就能执行计算
那有什么应用场景呢? 比如汇率计算!!!!!
object ImplicitParamTest2 {
/**
* 第一个参数是要换算成美元的人民币数目
* 第二个参数是汇率
*/
def rmb(dollar:Double)(implicit rate:Double = 6) = dollar * rate
def main(args: Array[String]): Unit = {
println ( rmb (100))
println ( rmb (100)(7))
// 引入隐式转换值,所以第二个参数被隐式的转换成了 6.66
import MyPredef._
println ( rmb (100))
}
}
object MyPredef{
// 声明一个 Double 类型的隐式转换值
implicit var current_rate :Double = 6.66
}
总结:
1、 隐式转换会首先从全局中寻找,寻找不到,才使用隐式参数
2、 隐式转换只能定义在 object 中
3、 如果隐式转换存在二义性