scala隐藏函数

0 阅读1分钟
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,具体分析如下:

  1. 隐式转换的触发:代码中定义了implicit def double2Int(d:Double):Int(隐式函数),当执行var i: Int = 1.1时,因为1.1Double类型,而变量iInt类型,Scala 会自动调用这个隐式函数,将Double转成Int
  2. 隐式函数的执行:隐式函数被调用时,会先执行println("double2Int被调用了......"),然后通过d.toInt1.1转成Int类型的1,所以i最终的值是1
  3. Int 转 Double 的自动转换:执行var d:Double = 1时,Int类型的1会被自动转为Double类型的1.0,所以d的值是1.0

实际运行代码时,控制台会输出:

plaintext

double2Int被调用了......

同时变量i=1d=1.0