隐式转换

当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型。

隐式转换

将某一类型转换成预期类型,在方法前加关键字implicit,下面的例子就是将一个String类型的变量隐式的转换为Int类型。
String类型是不能自动转换为Int类型,当给一个Int类型的变量或常量赋值给String类型(如下面语句)时会报错。

val x:Int = "01"

如果想让字符串自动转换为整形,就可以使用隐式转换

  implicit def strToInt(str: String) = str.toInt
  //字符串01默认转换成Int类型
  val x:Int = "01"
  val y = 12
  println(x+y)

隐式参数

当希望对某个参数列表采用默认参数时,可以使用implicit提供的隐式参数功能。在需要自动填充的参数列表最开端加上implicit,然后在定义域内定义需要填充的默认参数值常量,并在常量的定义之前声明implicit。

  //隐式参数
  def implicitParam(implicit name: String): Unit = {
    println(name)
  }

//  implicitParam 报错,找不到隐式参数

  //默认将隐式参数name传入implicitParam
  implicit val name = "Tom"
  implicitParam

  //报错,不知道两个参数该用哪一个
  implicit val name1= "Kim"
  implicit val name2 = "Lily"
  implicitParam

  //把所传值认为是隐式参数
  implicitParam("Tim")

隐式类

隐式类的主构造函数只能有一个参数(有两个以上并不会报错,但是这个隐式类永远不会被编译器作为隐式类在隐式转化中使用),且这个参数的类型就是将要被转换的目标类型。

  //隐式类
  implicit class CountUtil(x: Int){
    def add(a:Int): Int = a + x
  }

  //调用隐式类中的add方法,默认Int类中没有add方法
  println(3.add(5))
12-23 01:05