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
}