imp

33 阅读2分钟
package imp

/*
 * 隐式转换函数: 把double 转成 int
 */
object imp01 {
  implicit def double2Int(d:Double):Int = {
    println("调用 double2Int")
    d.toInt
  }

  def main(args: Array[String]): Unit = {
    var i:Int = 1;

    val d:Double = 1 // 把int --> double 。 隐式转换。把精度低的数据转换成精度高的数据,这是可以的!!!

    i = 1.5 // 把double --> int 。 把高精度的转成低精度的;错误!!!!
    println(i)
  }
}

运行结果如图所示:

image.png 可以相继输入下一个代码:

package imp

/*

*   银式参数:如果在写函数的参数的时候,预计某个参数的默认值可能会被修改。可以设置隐式参数。

        implicit val password:String="123456"
* */
object imp02 {
  
  implicit val defaultPassword:String = "1888888"

  def reg( name:String)(implicit password:String="123456"):Unit = {
    println(s"name:${name} pwd:${password}")
  }

  def main(args:Array[String]): Unit = {
    reg("张三")
    reg("李四")("admin")
  }
}

运行结果如图所示:

image.png 还可以继续运行下面的代码:

package imp

/*

* */
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 m2km(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(2000)
    println(m1)
    println(m2)
    println(km2)
  }
}

输入这些代码,点击运行,运行结果如图所示:

image.png 还可以输入以下代码:

// 隐式函数
/*
1. implicit 修饰。
2. 它会自动调用:当系统检测到模式匹配缺失的时候,自动调用。
3. 函数名字不重要,重要的是它的输入参数的类型和返回值类型
它的作用是:能隐性把一种类型的数据转成另一种类型的数据
*/
object imp04 {
  implicit def double2Int(d:Double):Int = {
    println("调用 double2Int")
    d.toInt
  }

  // implicit def xxxx(d:Double):Int = {
  //   println("调用 xxxx")
  //   d.toInt
  // }

  def main(args: Array[String]): Unit = {
    var i:Int = 1;

    val d:Double = 1 // 把 int --> double 。 隐式转换,把精度低的数据转换成精度高的数据,这是可以的!!!

    i = 1.2 // 把 double --> int 。 把高精度的转成低精度的,错误!!!
    i = 2.2
    i = 3.3
    println(i)
  }
}

运行结果如图所示:

image.png