Scala的隐式转换


隐式转换的一些总结

1.普通隐式转换

/**
 * @author Jinxin Li
 * @create 2020-10-28 18:50
 * 编译器在编译时,有可能编译不通过
 * 尝试在作用域范围内查找可以让程序编译通过的逻辑
 * 然后使用这段逻辑进行二次编译,让编译通过
 * 然后对指定的逻辑增加标记,告诉编译器这个标记可以进行二次编译
 * implicit
 *
 * 相同作用域下,相同的隐式转换规则不能使用多次
 */
object Match01_match {
  def main(args: Array[String]): Unit = {

    implicit def transform(d:Double)={
      d.toInt
    }//隐式函数,当编译不通过时,编译器会自动寻找

    val test = Test()
    val age: Int = test.age//这里接收的是Int类型
    println(age)
  }
  //第三方类库
  class Test{
    val age:Double = 20
  }
  object Test{
    def apply(): Test = new Test()
  }
}

2.不修改源码升级代码[重点]

object Match01_match {
  def main(args: Array[String]): Unit = {
    
    implicit def transform(user:User) ={
      new UserExt()
    }

    val user = new User()
    user.insertUser()

    user.updateUser()

  }
//---------------------------源码--------------
  class User {
    def insertUser(): Unit ={
      println("insert user....")
    }
  }
//---------------------------源码--------------
  class UserExt {
    def updateUser(): Unit ={
      println("update user....")
    }
  }
}

3.修改源码

需求:

/**
 * @author Jinxin Li
 * @create 2020-10-28 18:50
 * 不改源码修改密码参数
 */
object Match01_match {
  def main(args: Array[String]): Unit = {
    
    def reg(password : String = "000000"): Unit ={
      println("密码为"+password)
    }

  }
}

解决

/**
 * @author Jinxin Li
 * @create 2020-10-28 18:50
 * 不改源码修改密码参数
 */
object Scala_Implicit {
    def main(args: Array[String]): Unit = {
      implicit val password = "123123"
      def reg(implicit password: String = "000000"): Unit = {
        println("密码为" + password)
      }
      reg//调用隐式
      reg()
      reg("12313")
    }
}

文章作者: Jinxin Li
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jinxin Li !
  目录