隐式|(2)2025.12.31

34 阅读1分钟
object imp01 {
  // 隐式函数
  // 作用是:在类型转换的过程中,被自动调用
  // 特点:
  // 1. 自动调用
  // 2. 名字不重要,形参和返回值的类型是重要的!
  implicit def double2Int(d:Double):Int = {
    println("double2Int被调用了......")
    d.toInt
  }

  // 补充:String转Int的隐式转换(解决String赋值给Int的编译错误)
  implicit def string2Int(s: String): Int = {
    println("string2Int被调用了......")
    s.toInt
  }

  def main(args: Array[String]): Unit = {
    // 不能把Double类型 保存到 Int。这样会有精度损失,不会自动转换。
    var i: Int = 1.1

    i = 2.1
    i = 3.1
    i = "100" // String类型通过隐式转换赋值给Int

    // 可以把Int类型保存到Double,会自动转换
    var d:Double = 1
  }
}

隐式函数的本质是:给编译器预设「类型转换规则」,当检测到类型不匹配时,自动调用对应规则完成转换

它的核心特点(划重点):

  1. 自动触发:无需手动调用,编译器在类型不匹配时自动执行;
  2. 类型驱动:函数名不重要,入参类型 + 返回值类型才是匹配依据;
  3. 按需扩展:可以为任意类型组合定义转换规则。

隐式函数的 3 个实战注意事项

  1. 单一匹配原则:同一作用域内,同一类型组合只能有一个隐式函数(否则编译器会因 "歧义" 报错);
  2. 异常需处理:实际开发中,s.toInt 可能因字符串非数字抛出异常,建议增加防御逻辑: