SCALA面向对象编程(二)

五、隐式转换和隐式函数

5.1隐式转换

//关键词: implicit    作用:将值从一种类型转换为另一种类型。

implicit def a(d: Double) = d.toInt // 先声明隐式函数,声明后就不用管,程序过不去,会自动查找。

val i1: Int = 3.5 //(OK)当发现程序有误时,Scala编译器会尝试在隐式函数列表中查询可以进行转换的函数

注意:

  • 隐式转换函数的函数名可以是任意的,隐式转换与函数名称无关,只与函数签名(函数参数类型和返回值类型)有关
  • 需要保证在当前环境下,只有一个隐式函数能被识别,不能存在多个

5.2利用隐式转换补充自定义类的功能

//如果需要为一个类增加一个方法,可以通过隐式转换来实现。(动态增加)

如想为MySQL增加一个delete方法

class WorkerV1(){
   def update(): Unit ={
      println("update")
   }
}

class WorkerV2(){
  def delete(): Unit ={
    println("delete")
  }
}

//在实际使用时,如果需要为workerV1补充workerV2里的功能,可以利用隐式转换

 implicit def workerV1toV2(d:WorkerV1):WorkerV2={
   new WorkerV2;
}
var workerV1=new WorkerV1();
workerV1.update();

workerV1.delete;
workerV1.update();

5.3隐式类

//通过隐式类解决,把需要转换的源类型作为新类型的构造函数的参数。

implicit class WorkerV3(d:WorkerV1){
  def add(): Unit ={
    println("add")
  }
}

5.4隐式参数

//作用:可以帮助函数中,某种类型的参数设定统一的默认值。

 def query(implicit  string: String): Unit ={
    println("add"+string)
  }

 

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)

猜你喜欢

转载自blog.csdn.net/lyk2132X/article/details/82154934