imp

36 阅读1分钟

隐式转换

作用是:在类型转换的过程中,被自动调用

特点

  • 自动调用
  • 名字不重要,形参和返回值的类型是重要的!
  1. 不能把Double类型保存到 Int。这样会有精度损失,不会自动做转换。
  2. 可以把int类型保存到Double,会自动转
package imp

object imp01 {
  // 隐式转换
  // 作用是:在类型转换的过程中,被自动调用
  // 特点
  // 1. 自动调用
  // 2. 名字不重要,形参和返回值的类型是重要的!
  implicit def double2Int(d: Double): Int = {
    println("double2Int被调用了......")
    d.toInt
  }

  // 新增:String转Int的隐式转换(解决i = "100"的类型不匹配)
  implicit def string2Int(s: String): Int = {
    println("string2Int被调用了......")
    s.toInt
  }

  def main(args: Array[String]): Unit = {
    // 不能把Double类型 保存到 Int。这样会有精度损失,不会自动做转换。
    var i: Int = 1.1
    i = 2.1
    i = 3.1
    i = "100" // 现在可通过隐式转换支持String转Int
    // 可以把int类型保存到Double,会自动转换
    var d: Double = 1
  }
}
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)
  }
}

补充隐式函数:实现WY(美元)到RMB(人民币)的转换

package imp

object imp03 {
  // 1美元 = 6.9人民币
  // 1人民币 = 0.14美元
  class WY(var value:Double) {
    override def toString: String = s"${value}美元"
  }

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

  // 补充隐式函数:实现WY(美元)到RMB(人民币)的转换
  implicit def wy2rmb(wy: WY): RMB = {
    new RMB(wy.value * 6.9)
  }

  def main(args: Array[String]): Unit = {
    val m1:RMB = new WY(100)
    println(m1)
  }
}