scala的隐式转换基本使用

17 阅读2分钟

讲授新课

(一)什么是隐式转换

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

(二)隐式函数

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

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

注意点:

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

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

package imp

/*
 * 隐式转换函数: 把double 转成 int
 *
 * 影视函数
 * 1.implicit 修饰。
 * 2.他会自动被调用。当系统检测到隐式转换失败的时候,去自动调用。
 * 3.函数的名字不重要,重要的是它的输入类型和返回值类型
 *
 * 它的作用是:偷偷地把一种类型的数据转换成另一种类型的数据
 */
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 = i // 把Int ---> double 。隐式转换。把精度低的数据转换成精度高的数据,这是可以的!!!

    i = 1.5 // 把double ---> int 。把高精度的转成低精度的的,错误!!!
    i = 2.2
    i = 3.3

    println(i)
  }
}

(三)隐式参数

如果一个参数的默认值会反复修改 新的领导说用户密码全是0,在键盘的右边,对使用者不友好。要改成123123

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

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

如果一个函数有多个参数,并且你只想对某个参数进行隐式转换,那么,可以使用柯里化的方式来定义参数,并且把转换的参数定义在参数列表的最后。

package imp

/*
 * 隐式参数: 如果在写函数的参数的时候, 预计某个参数的默认值可能会被修改。可以设置隐式参数。
 *
 *    implicit password:String="123456"
 */
object imp02 {
  implicit val defaultPassword:String = "8888888"


  def reg(name:String)(implicit password:String="123456"):Unit = {
    println(s"用户名:${name}, 密码: ${password}")
  }

  def main(args: Array[String]): Unit = {
    reg("小花")
    reg("小明")("admin")
  }
}