Scala隐式转换

1. 隐式转换概念

  • 隐式转换就是将一个类赋予另外一个类中的属性和能力

2. 例子

  • 将所有隐式转换的方法单独放到一个文件中
// ImplicitApp.scala
import java.io.File
/**
 * Author: 3zZ.
 * Date: 2020/1/10 11:15 下午
 */
object ImplicitAspect {
  // 定义隐式转换函数即可
  // 案例1 将只有eat方法的普通人变成有fly方法的超人
  implicit def man2superman(man:Man): Superman = new Superman(man.name)
  // 案例2 为File对象添加直接读的方法
  implicit def file2Richfile(file: File): Richfile = new Richfile(file)
}
  • 在需要使用的文件进行引入
import java.io.File
import ImplicitAspect._
/**
 * Author: 3zZ.
 * Date: 2020/1/10 11:00 下午
 */
object ImplicitApp extends App {
  // 定义隐式转换函数即可
  // 案例1
  val man = new Man("3z")
  man.fly() // 能够成功飞行
  // 案例2 为File对象添加直接读的方法
  val file = new File("/Users/3zz/Desktop/test.txt")
  file.read() // 能够正常读出文件
}
class Man(val name: String) {
  def eat(): Unit = {
    println(s"man $name is eating")
  }
}
class Superman(val name: String) {
  def fly(): Unit = {
    println(s"superman $name is flying")
  }
}
class Richfile(val file:File){
  def read() ={
    scala.io.Source.fromFile(file.getPath).mkString
  }
}

3. 隐式参数例子

/**
 * Author: 3zZ.
 * Date: 2020/1/10 11:00 下午
 */
object ImplicitApp extends App {
  implicit val test = "test"
  def testParam(implicit name:String ): Unit ={
    println(name)
  }
//  testParam 什么都不填会报错 (如果在上面定义了test 就不会报错)
//  testParam("123") 正常输出 123
  implicit val name1: String = "implicit_name"
  testParam // 此时有了implicit 就不会报错 正常输出 implicit_name
  testParam("3z") // 输出 3z
  implicit val s1 = "s1"
  implicit val s2 = "s3"
  testParam // 此时会报错 因为有两个不确定
}

4. 隐式类例子

/**
 * Author: 3zZ.
 * Date: 2020/1/10 11:32 下午
 */
object ImplicitClassApp extends App {
  implicit class Cal(x:Int){
    def add(a:Int) = a + x
  }
  // 1本身是没有add方法的
  // 上面的隐式类为所有的Int类型添加了add方法
  println(1.add(3)) // 4
}