隐式转换
隐式转换是指:scala自动把一种类型转成另一种类型的过程。
object imp01 {
implicit def doubleToInt(x:Double):Int = {
println("double to int ...")
x.toInt
}
def main(args: Array[String]): Unit = {
// 1. 隐式转换
var i:Int = 1;
var d:Double = 1.1;
d = i // 把int → double类型
// d = i.toDouble
// println(s"d=${d}")
i = d // 存在一个隐式转换 把double → int 报错!!!!
i = 100.1
i = 100.1
}
}
scala就做了一次隐式转换:把Int -> Double。
隐式函数
隐式函数的定义:通过implicit关键字修饰的函数,它的功能是把一种类型的数据转成另一种类型。
注意点:
(1)调用时机,在系统自动把数据从类型1隐式转为类型2时出错时,被自动调用。
(2)函数名可以自定义(一般取名为类型1to类型2),但是参数和返回值必须有限制。
object imp01 {
// 隐式转换函数
// 1. 用关键字implicit 修饰
// 2. 它的函数名不重复(一般的命名是类型1To类型2),重复的是它的 参数和返回值的 类型。
// 3. 系统会自动调用它
// 注意:不能写两个同类型( 参数和返回值的类型都一样)的隐式转换函数,它会报错!!
// 它的参数是Double,它的返回值是Int,它的作用是: 当代码出现了需要把Double转换为Int的时候。系统会自动调用它
implicit def doubleToInt(x:Double):Int = {
println("double to int ...")
x.toInt
}
// implicit def xxxx(x:Double)}:Int = {
// println("double to int ...")
// x.toInt
// }
def main(args: Array[String]): Unit = {
// 1. 隐式转换
var i:Int = 1;
var d:Double = 1.1;
d = i // 把int → double类型,它会自动也去调用隐式转换函数!
// d = i.toDouble
// println(s"d=${d}")
i = d // 存在一个隐式转换 把double → int 报错!!!!
i = 100.1
i = 100.1
}
}
隐式参数
在开发的过程中,如果知道有个参数会被改动,就可以添加implicit,但是implicit在参数列表中只能出现一次,并要写在参数列表的最前面,对所有的参数列表生效。
如果一个函数有多个参数,并且你只想对某个参数进行隐式转换,那么,可以使用柯里化的方式来定义参数,并且把转换的参数定义在参数列表的最后。
// 在写代码的过程中,有一个原则:尽量不要修改之前的代码
// 隐式参数
// 在开发的过程中,如果预判一个参数将来会变动,就可以把它设置为implicit
object imp02 {
implicit val defaultPassword:String = "88888888"
def reg(name:String)(implicit password:String="123456"): Unit = {
println(s"您注册成功,姓名${name}, 密码:${password}")
}
// def reg(name:String, password:String="123456"): Unit = {
// println(s"您注册成功,姓名${name}, 密码:${password}")
// }
def main(args: Array[String]): Unit = {
reg("小花") // 没有传入密码,使用默认值123456
reg("小白")("admin")
}
}