学习链接:https://www.bilibili.com/video/BV1Xh411S7bP?p=138&spm_id_from=pageDriver


  1. 当编译器第一次编译失败的时候,会在当前的环境中查找能让代码编译通过的方法,用<br />于将类型进行转换,实现二次编译

1 隐式函数

隐式转换可以在不需改任何代码的情况下,扩展某个类的功能

// 通过隐式转化为 Int 类型增加方法
class MyRichInt(val self: Int) {
  def myMax(i: Int): Int = {
    if (self < i) i else self
  }
  def myMin(i: Int): Int = {
    if (self < i) self else i
  }
}

object TestImplicitFunction {
  // 1. 隐式函数
  // 使用implicit关键字声明的函数称之为隐式函数
  implicit def convert(arg: Int): MyRichInt = {
    new MyRichInt(arg)
  }

  def main(args: Array[String]): Unit = {
    // 当想调用对象功能时,如果编译错误,编译器会尝试在当前作用域范围内查找能调用对应功能的转换规则,这个调用过程是由编译器完成的,称之为隐式转换
    println(2.myMax(6))
  }
}

2 隐式参数

// 3. 隐式参数
// 参数名不相同,找的是相同类型
implicit val str: String = "aaa"
def sayHello(implicit name: String): Unit = {
  println("hello" + name)
}

// def sayHi()(implicit name: String = "bbb"): Unit,隐式值会覆盖默认值
def sayHi()(implicit name: String): Unit = {
  println("hi" + name)
}

sayHello
sayHi() // 函数声明是有括号要加括号

// 简便写法
implicit val age: Int = 20
def hiAge(): Unit = {
  println("hi," + implicitly[Int])
}
hiAge()

3 隐式类

def main(args: Array[String]): Unit = {
  // 当想调用对象功能时,如果编译错误,编译器会尝试在当前作用域范围内查找能调用对应功能的转换规则,这个调用过程是由编译器完成的,称之为隐式转换
  println(2.myMax(6))

  // 隐式类
  implicit class MyRichInt2(val self: Int) {
    def myMax2(i: Int): Int = {
      if (self < i) i else self
    }
    def myMin2(i: Int): Int = {
      if (self < i) self else i
    }
  }
  println(12.myMax(2))
}
  • 其所带的构造参数有且只能有一个
  • 隐式类必须被定义在“类”或“伴生对象”或“包对象”里,即隐式类不能是顶

级的。

4 隐式解析机制