scala的隐式转换基本使用(二)

22 阅读2分钟

转换规则

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

规则2:不能多次转换:在一次转换过程中可以把A->B,B->C,但是不能直接从A->C。来通过具体的代码来说明。

作用域

把隐式函数的定义放在哪里使用起来更加方便

先说一个不能放的位置:implicit 不能放在顶级作用域(不能放在类的外边)会报错

在实际的操作过程中,建议把它定义在如下两个地方:

1.包对象。这样在这个包下的所有类和对象中都可以使用,并且不需要额外的引入语句。

  1. 一个单独的文件定义中。这样在其他需要的位置就可以直接导入,然后使用。
// 隐式转换规则
// 1. 无歧义规则。 不能重新定义两个相同的转换函数
/*
implicit def fun1(a:String):Int = a.toInt
  implicit def fun2(a:String):Int = a.toInt


  def main(args: Array[String]): Unit = {

    val i:Int = "100"

  }
*
* */
// 2. 不能多次转换。
//  在一次转换中,A → B, B → C。不能把 A → C
//               千米 --> 百米  百米 --> 米 。 千米 --> 米

object imp3 {
  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}米"}

  implicit def km2bm(km:KM):BM = new BM(km.value*10)
  implicit def bm2m(bm:BM):M = new M(bm.value*100)

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

  def main(args: Array[String]): Unit = {

    val km = new KM(1.1)
    val bm:BM = km
    println(km)
    println(bm)


    val m:M = bm
    println(m)

    val m1:M = new KM(2)
    println(m1)
  }
}

其他需要使用的地方导入:

import mplication.Implications._ image.png