1、隐式转换概述
需求:为一个已存在的类添加一个新的方法
java:动态代理
scala:隐式转换
2、隐式转换实战
main{
//定义隐式转换函数即可
implicit def man2superman(man:Man):Superman = new Superman(man)
val man = new Man("Messi")
man.fly()
implicit def file2RichFile(file:File):RichFile = new RichFile(file)
val file = new File("")
val txt = file.read()
println(txt)
}
class Man(val name:String){
def eat():Unit={
println(s"man[$name]eat..")
}
}
class Superman(val name:String){
def fly():Unit={
println(s"superman[$name]fly...")
}
}
class RichFile(cal file:File){
def read()={
scala.io.Source.fromFile(file.getPaht).mkString
}
}
3、隐式参数
指的是在函数或者方法中,定义一个用implicit修饰的参数,此时Scala会尝试找到一个指定类型的,用implicit修饰的对象,即隐式值,并注入参数
main{
场景一:
testParam() //编译不报错,运行报错
testParam("zhangsan") //可以运行
场景二:
implicit val name = "implicit_name"
testParam() //此时没有问题 implicit_name
testParam("zhangsan") //zhangsan
场景三:
implicit val s1 = "s1"
implicit val s2 = "s2"
testParam //Error: ambiguous imolicit values
def testParam(implicit name:String):Unit = {
println(name+"~~~~~~~~")
}
}
注意:方法,类,伴生类等中只要能找到都可以,
4、隐式类
就是对类增加implicit限定的类,其作用主要是对类的加强!
object ImplicitClass extends App{
implicit class Calculator(x:Int){
def add(a:Int)=a+x
}
println(12.add(3)) //成功
println("12".add(3)) //失败
}