隐式转换2

76 阅读1分钟

隐式参数

如果一个参数的默认值会反复修改

def reg(name:String, password:String="000000"):Unit = {  
  println()// 注册用户名,默认密码为00000  
}  
reg("张三", "111111")  
reg("李四")

新的领导说用户密码全是0,在键盘的右边,对使用者不友好。要改成123123

你看,这样就修改了原来的代码。

在开发的过程中,如果知道有个参数会被改动,就可以添加implicit,但是implicit在参数列表中只能出现一次,并要写在参数列表的最前面,对所有的参数列表生效。

转换规则****

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

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

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

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

object imp03 {
  class KM(var value:Double) {
    override def toString: String = s"${value} 千米"
  }
  class BM(var value:Double) {
    override def toString: String = s"${value} 百米"
  }
  class M(var value:Double) {
    override def toString: String = s"${value} 米"
  }
  // 补充隐式转换函数,把 KM -> M
  implicit def km2m(km:KM):M = { new M(km.value * 1000) }
  implicit def k2km(m:M):KM = { new KM(m.value / 1000) }
  // 补充隐式函数,把 BM -> M
  implicit def bm2m(bm:BM):M = { new M(bm.value * 100) }

  def main(args: Array[String]): Unit = {
    val km1 = new KM(2)
    val m1:M = km1
    val m2:M = new BM(2)

    val km2:KM = new M(2500)

    println(m1)
    println(m2)
    println(km2)
  }
}