scala的隐式转换基本使用

19 阅读1分钟

(一)、什么是隐式转换

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

(二)、隐式函数

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

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

注意点:

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

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


object imp01 {

  //隐式转换函数
  //1.用关键字implicit 修饰
  //2.它的函数名不重要(一般的命名类型1To类型2),重要的是它的 参数和返回值 类型
  //3.系统会自动调用它

  //注意:不能写两个同类型(参数和返回值的类型都一样)的隐式转换函数,它会报错!!!

  //它的参数是Double,它的返回值是Int,它的作用是:当代码中出现了需要把Double转换成Int的时候,系统会自动调用它
  implicit def double2Int(x:Double):Int = {
    println("double to int ...")
    x.toInt
  }
  
//  implicit def xxxx(x:Double):Int = {
//    println("double to int ...")
//    x.toInt
//  }

  def main(args: Array[String]): Unit = {
    //1.隐式转换
    var i:Int = 1;

    var d:Double = 1.1;

    d = i //把int → double类型,它会自动也去调用隐式转换函数!

//    d = i.toDouble
//    println(s"d=${d}")

    i = d//存在一个隐式转换  把double → int 报错!!!
    i = 100.1
    i = 100.1
  }
}

(三)、隐式参数

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

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

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


//在写代码的过程中,有一个原则:尽量不要修改之前的代码
//隐式参数
//   在开发的过程中,如果预判一个参数将来会变动,就可以把它设置为implicit

object imp02 {
  implicit val defaultPassword:String = "88888888"

  def reg(name:String)(implicit password:String="123456"):Unit = {
    println(s"您注册成功,姓名:${name},密码:${password}")
  }
//  def reg(name:String,password:String="123456"):Unit = {
//    println(s"您注册成功,姓名:${name},密码:${password}")
//  }

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

    reg("小花")//没有传入密码,使用默认值123456
    reg("小白")("admin")

  }
}