41scala的隐式转换基本使用

28 阅读2分钟

一) 什么是隐式转换

隐式转换是指:scala自动把一种类型转成另一种类型的过程。这个过程对用户编程而言不可见,不需要用户手动编写代码

package imp

object imp01 {
  // 定义隐式转换函数:将Double转为Int
  implicit def double2Int(d: Double): Int = {
    println("double2Int被调用了……")
    d.toInt  // Double转Int(会丢失小数部分)
  }

  def main(args: Array[String]): Unit = {
    // 原本:Double不能直接赋值给Int(精度丢失),但隐式转换会自动触发
    var i: Int = 1.1  // 这里会自动调用double2Int,把1.1转成Int类型的1

    // Int可以自动转Double(无精度丢失),不需要隐式转换
    var d: Double = 1
  }
}

image.png

隐式函数

在scala.Predef中,可以看到有系统提供了默认的情况。

隐式函数的定义:通过implicit关键字修饰的函数,它的功能是把一种类型的数据转成另一种类型。

implicit def 函数名(参数:类型1):类型2 = {

函数体

}

注意点:

(1)调用时机,在系统自动把数据从类型1隐式转为类型2时出错时,被自动调用。

(2)函数名可以自定义(一般取名为类型1to类型2),但是参数和返回值必须有限制。 package imp

/* *隐式转换函数:把double 转换成 int

  • 隐式函数
  • 1.implic 修饰
  • 2.它会自动被调用。当系统检测到隐式转换失败的时候,去自动调用。
  • 3.函数的名字不重要,重要的是它的输入数据的类型和返回值类型!
  • 他的作用:偷偷地把一种类型的数据转换成另一种类型的数据!
 
object imp01 {

  implicit def double2Int(d:Double):Int = {
    println("调用double2Int")
    d.toInt
  }

  def main(args: Array[String]): Unit = {
    var i:Int = 1

    val d:Double = i // 把int --> double。 隐式转换。把精度低的数转换成精度高的数,这是可以的!!!
    i = 1.2 // 把double ---> int。把高精度的转换成低精度的,编译报错!!!!
    i = 2.2
    i = 3.3

    println(i)
  }
  
}