(一) 什么是隐式转换
隐式转换是指:scala自动把一种类型转成另一种类型的过程。这个过程对用户编程而言不可见,不需要用户手动编写代码。
(二) 隐式函数
在scala.Predef中,可以看到有系统提供了默认的情况。
隐式函数的定义:通过implicit关键字修饰的函数,它的功能是把一种类型的数据转成另一种类型。
注意点:
(1)调用时机,在系统自动把数据从类型1隐式转为类型2时出错时,被自动调用。
(2)函数名可以自定义(一般取名为类型1to类型2),但是参数和返回值必须有限制。
package imp
/*
*隐式转换函数:把double 转换成 int
*
* 隐式函数
* 1.implic 修饰
* 2.它会自动被调用。当系统检测到隐式转换失败的时候,去自动调用。
* 3.函数的名字不重要,重要的是它的输入数据的类型和返回值类型!
*
* 他的作用:偷偷地把一种类型的数据转换成另一种类型的数据!
**/
object imp01 {
implicit def double2Int(d:Double):Int = {
println("调用double2Int")
d.toInt
}
def main(args: Array[String]): Unit = {
var i:Int = 1
val d:Double = i // 把int --> double。 隐式转换。把精度低的数转换成精度高的数,这是可以的!!!
i = 1.2 // 把double ---> int。把高精度的转换成低精度的,编译报错!!!!
i = 2.2
i = 3.3
println(i)
}
}
(三) 隐式参数
在开发的过程中,如果知道有个参数会被改动,就可以添加implicit,但是implicit在参数列表中只能出现一次,并要写在参数列表的最前面,对所有的参数列表生效。
package imp
/*
* 隐式参数:如果在写函数的参数的时候,预计某个参数的默认值可能会被修改。可以设置隐式参数。
implicit password:String="123456"
**/
object imp02 {
implicit val defaultPassword:String = "8888888"
def reg(name:String)(implicit password:String="123456"):Unit = {
println(s"用户名:${name}, 密码:${password}")
}
def main(args: Array[String]): Unit = {
reg("小花")
reg("小明")("admin")
}
}