隐式转换:为一个已经存在的东西,添加一个功能需求(比如:为一个已经存在的类添加一个新的方法)
满足上述需求,Java使用的是动态管理,Scala使用的是隐式转换
一个例子:
//定义了两个类Man和Superman,现在的需求是Man的对象也可以拥有fly()方法
object ImplicitApp extends App {
val man=new Man("Nina")
//定义隐士转换的函数 必须要先用implicit声明这个函数
implicit def man2superman(man:Man):Superman={
new Superman(man.name)
}
//定义完隐士转换函数后,man可以fly了
man.fly;
}
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")
}
}
结果:
superman Nina fly
隐式转换切面封装:隐式转换的定义函数都写在一个类中,要使用的时候import一下
如上面的例子:先新定义一个切面,引用的时候要import一下
//隐式转换的函数都放在这个类中
object ImplicitAspect {
//定义隐士转换的函数 必须要先用implicit声明这个函数
implicit def man2superman(man:Man):Superman={
new Superman(man.name)
}
}
import ImplicitAspect._ //把切面import进来
object ImplicitApp extends App {
val man=new Man("Nina")
//定义完隐士转换函数后,man可以fly了
man.fly
}
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")
}
}
还有隐式参数和隐式类,都不建议使用,源码中看到后再来补充吧……