scala的隐式转换基本使用

13 阅读2分钟

(一)什么是隐式转换

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

scala
 体验AI代码助手
 代码解读
复制代码
package imp
//隐式函数
//作用是:在类型转换的过程中,被自动调用
//特点
// 1.自动调用
//2 名字不重要,形参和返回值的类型是重要的

object imp01 {
  // 隐式 偷偷地
  implicit def double2Int(d:Double) :Int= {
    println("double2Int被调用了")
    d.toInt
  }
//  implicit def string2Int(d:String) :Int= {
//    println("double2Int被调用了")
//    s.toInt
//  }

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

    i  = 2.1
    i = 3.1

//    i ="100"

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

隐式函数****

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

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

scala
 体验AI代码助手
 代码解读
复制代码
package imp

object imp02 {
  class KM(var value:Double) {
    override def toString:String = s"${value}千米"
  }

  class M(var value:Double) {
    override def toString:String = s"${value}米"
  }

  implicit def km2m(km: KM):M = {
    new M(1000 * km.value)
  }

  def main(args: Array[String]): Unit = {
    val km1 = new KM(1)

    val m1:M = km1
    println(km1)
    println(m1)
  }
}
scala
 体验AI代码助手
 代码解读
复制代码
package imp
//1美元 = 6.9人民币
//1 人民币 = 0.14美元

object imp03 {
  class MY(var value:Double) {
    override def toString:String = s"${value}美元"
  }

  class RMB(var value:Double) {
    override def toString:String = s"${value}人民币"
  }

  implicit def my2rmb(my: MY): RMB = {
    new RMB(my.value * 6.9)
  }
  implicit def rmb2my(rmb:RMB): MY ={
    new MY(rmb.value *0.14)
  }

  def main(args: Array[String]): Unit = {
    val km1 = new MY(100)

    val m1:RMB = new MY(1000)
    println(km1)
    println(m1)
  }
}