package imp
object class11 {
// 隐式 偷偷的 .....
implicit def double2Int(d:Double):Int = {
println("double2Int被调用了......")
d.toInt
}
def main(args: Array[String]): Unit = {
// 不能把Double类型 保存到 Int。这样会有精度损失,不会自动做转换
var i: Int = 1.1
// 可以把int类型保存到Double,会自动转换
var d:Double = 1
}
}
这段代码的执行结果是先打印 “double2Int 被调用了......”,然后i的值为 1,d的值为 1.0,具体分析如下:
- 隐式转换的触发:代码中定义了
implicit def double2Int(d:Double):Int(隐式函数),当执行var i: Int = 1.1时,因为1.1是Double类型,而变量i是Int类型,Scala 会自动调用这个隐式函数,将Double转成Int。 - 隐式函数的执行:隐式函数被调用时,会先执行
println("double2Int被调用了......"),然后通过d.toInt把1.1转成Int类型的1,所以i最终的值是1。 - Int 转 Double 的自动转换:执行
var d:Double = 1时,Int类型的1会被自动转为Double类型的1.0,所以d的值是1.0。
实际运行代码时,控制台会输出:
plaintext
double2Int被调用了......
同时变量i=1、d=1.0。