scala的隐式转换基本使用

14 阅读1分钟

什么是隐式转换

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

object imp01 {
  //隐式 偷偷地......
  implicit def double2Int(d:Double):Int={
    println("double2Int被调用了......")
    d.toInt
  }
  def main(args: Array[String]): Unit = {

    //不能把Double类型保存到Int。这样会有精度损失,不会自动做转换。
    var i:Int = 1.1 :Double

    //可以把int类型保存到Double,会自动转换
    var d:Double = 1
  }
}
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)
  }
}

#### 转换规则

隐式转换确实非常的强大,但是,在具体的使用过程中,我们要遵循一些特定的转换规则。

具体来说有两点:无歧义规则,不能多次转换。下面我们分别来解释

规则1:无歧义规则:不能重新定义两个相同的转换函数。如果有两个隐式转换函数,只有函数名不同,则会导致错误。

规则2:不能多次转换:在一次转换过程中可以把A->B,B->C,但是不能直接从A->C。

object imp03 {
  //1美元=6.9人民币
  //1人民币=0.14美元

  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(6.9*my.value)
  }
  implicit def rmb2my(rmb:RMB):MY={
    new MY(0.14*rmb.value)
  }
  def main(args: Array[String]): Unit = {
    val m1:RMB = new MY(100)
    println(m1)

    val my1:MY=new RMB(1000)
    println(my1)
  }
}