五、隐式转换和隐式函数
5.1隐式转换
//关键词: implicit 作用:将值从一种类型转换为另一种类型。
implicit def a(d: Double) = d.toInt // 先声明隐式函数,声明后就不用管,程序过不去,会自动查找。 val i1: Int = 3.5 //(OK)当发现程序有误时,Scala编译器会尝试在隐式函数列表中查询可以进行转换的函数 |
注意:
- 隐式转换函数的函数名可以是任意的,隐式转换与函数名称无关,只与函数签名(函数参数类型和返回值类型)有关
- 需要保证在当前环境下,只有一个隐式函数能被识别,不能存在多个
5.2利用隐式转换补充自定义类的功能
//如果需要为一个类增加一个方法,可以通过隐式转换来实现。(动态增加)
如想为MySQL增加一个delete方法 class WorkerV1(){ //在实际使用时,如果需要为workerV1补充workerV2里的功能,可以利用隐式转换 implicit def workerV1toV2(d:WorkerV1):WorkerV2={ |
5.3隐式类
//通过隐式类解决,把需要转换的源类型作为新类型的构造函数的参数。
implicit class WorkerV3(d:WorkerV1){ |
5.4隐式参数
//作用:可以帮助函数中,某种类型的参数设定统一的默认值。
def query(implicit string: String): Unit ={ def main(args: Array[String]): Unit = { implicit val string ="zhang3"
query //可以直接省略参数 利用声明的隐式参数默认值补充 } |
5.5 隐式的转换时机
1) 类型不一致时
2) 缺少方法
3)缺少参数时
5.6隐式转换的前提
1) 不能存在二义性
2) 优先选用显示的声明或者定义
5.7Demo
//给当前日期加1天的效果
implicit class D(d: Date) {
def +(i: Int): Date = {
val calendar = Calendar.getInstance()
calendar.setTime(date)
calendar.add(Calendar.DAY_OF_MONTH, i)
calendar.getTime
}
}
var date = new Date()
println(date)
date = date + 1
println(date) |
//给当前日期加1秒的效果(此方法存在损失精度,不推荐) implicit def D(date:Date):Long=date.getTime/1000
implicit def E(l:Long):Date={
val d = new Date()
d.setTime(l*1000)
d
}
var date = new Date()
println(date)
date = date + 1
println(date) var date = new Date() println(date) date = date + 1 println(date) |