Scala 速通语法(八)| 隐式转换

隐式转换


  • 隐式转换函数: implicit 关键字声明的带有单个参数的函数。这种函数将会自动应用,将值从一种类型转换为另一种类型
object ImplicitDemo01 {
  def main(args: Array[String]): Unit = {
    //编写一个隐式函数 完成Double-》Int
    implicit def ff(double: Double):Int={
      double.toInt
    }
    var a:Int = 3.8  //将double 隐式转换赋值给Int
  }
}
  • 注意与细节
    • 隐式转换函数的函数名可以是任意的,隐式转换与函数名称无关,只与函数签名(函数参数类型和返回值类型)有关
    • 隐式函数可以有多个(即:隐式函数列表),但是需要保证在当前环境下,只有一个隐式函数能被识别
    • 注意作用域 只能在当前作用域才能生效
    • 保证匹配的函数是唯一的
  • 使用
    • 隐式转换可以动态增加类的功能
    //接受一个类
    implicit def addDelete(msql:MySQL): DB = {
      new DB
    }
    // 使用其原本没有的方法
    mySQL.delete() // 编译器工作 分析 addDelete$1(mySQL).delete()
    

隐式值

  • 隐式值也叫隐式变量,将某个形参变量标记为 implicit,所以编译器会在方法省略隐式参数的情况下去搜索作用域内的隐式值作为缺省参数
    • 编译器优先级 传值 > 隐式值 > 默认值
    object ImplicitDemo02 {
      def main(args: Array[String]): Unit = {
        implicit val str:String = "zhy"
        def pl(implicit name:String): Unit ={
          println("str =" + name)
        }
        pl
      }
    }
    

隐式类

  • 在 scala2.10 后提供了隐式类,可以使用 implicit 声明类,隐式类的非常强大,同样可以扩展类的功能,比前面使用隐式转换丰富类库功能更加的方便,在集合中隐式类会发挥重要的作用
  • 特点
    1. 隐式类构造参数有且只能有一个
    2. 隐式类必须被定义在 类 或者伴生对象或者包对象里,即隐式类 不能是顶级的 (top-level-object)
    3. 隐式类不能是 case class
    4. 作用域不能有与之相同名称的标识符

在隐式转换时 需要注意

不能存在二义性
隐式操作不能嵌套使用

posted @ 2021-09-26 11:48  —清风碎心—  阅读(37)  评论(0编辑  收藏  举报