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
}
}
隐式函数的本质是:给编译器预设「类型转换规则」,当检测到类型不匹配时,自动调用对应规则完成转换。
它的核心特点(划重点):
- 自动触发:无需手动调用,编译器在类型不匹配时自动执行;
- 类型驱动:函数名不重要,入参类型 + 返回值类型才是匹配依据;
- 按需扩展:可以为任意类型组合定义转换规则。
隐式函数的 3 个实战注意事项
- 单一匹配原则:同一作用域内,同一类型组合只能有一个隐式函数(否则编译器会因 "歧义" 报错);
- 异常需处理:实际开发中,
s.toInt可能因字符串非数字抛出异常,建议增加防御逻辑: