scala的隐式转换基本使用

31 阅读2分钟

(一) 什么是隐式转换

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

scala就帮我们做了一次隐式转换:把Int -> Double。

但是反过来,不能把Double → Int

var i:Int= 1;

val b:Double = i

var i:Int= 1.5;  // 这里会报错

隐式函数

  1. 作用:在类型转换的过程中,被自动调用
  2. 特点:自动调用;名字不重要,形参和返回值的类型是重要的!

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

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

注意点:

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

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

object imp01 {
  //隐式 偷偷的,.....
  implicit def double2Int(d:Double):Int ={
    println("double2Int被调用了....")
    d.toInt
  }
  def mian(args: Array[String]): Unit = {
    //不能把Double类型保存到Int。这样会精度损失,不会自动做转换
    var i: Int = 1.1
    //可以把Int类型保存到Double,会自动转换
    var d:Double = 1
  }
}
  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)
  }
}
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(7.5 * my.value)
}
implicit def rmb2my(RMB: RMB):MY = {
  new RMB(0.14 * my.value)
}
def main(args: Array[String]): Unit = {
  val m1:RMB = new MY(100)
  println(m1)

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