Scala提供的隐式转换和隐式参数功能,允许你手动指定,将某种类型的对象转换成其他类型的对象,通过这些功能,可以实现非常强大而且特殊的功能。
scala的隐式转换,最核心的就是定义隐式转换函数,即implicit conversion function.
1、隐式转换(案例:特殊售票窗口)
class SpecialPerson(val name:String)
class Student(val name:String)
class Older(val name:String)
object Main{
def main(args: Array[String]): Unit = {
val stu = new Student("students")
buySPecialTicket(stu)
}
implicit def object2SpecialPerson(obj:Object):SpecialPerson={
if(obj.getClass == classOf[Student]){
val stu = obj.asInstanceOf[Student];
new SpecialPerson(stu.name)
}else if(obj.getClass == classOf[Older]){
val old = obj.asInstanceOf[Older];
new SpecialPerson(old.njame)
}else null
}
var ticker=0
def buySPecialTicket(p:SpecialPerson)={
ticker +=1
println("T-" + ticker)
}
}
2、使用隐式转换加强现有类型(案例:超人变身),类似于装饰着模式
隐式转换,可以为某个类定义一个加强版的类,并定义互相之间的隐式转换,从而让源类在使用加强版的类的方法时,由scala自动进行隐式转换为加强类,然后再调用该方法。
class Man(val name:String)
class SuperMan(val name:String){
def emitLaster = println("emit a laster!")
}
object Main{
implicit def man2SUperMan(man:Man):SuperMan=new SuperMan(man.name)
def main(args: Array[String]): Unit = {
val leo = new Man("leo")
leo.emitLaster
}
}
3、隐式转换函数的作用域与导入
scala默认会使用两种隐式转换:
1)一种是源类型或目标类型的伴生对象内的隐式转换函数;
2)一种是当前程序作用域内的隐式转换函数;
如果隐式转换函数不在以上两种情况的花,那么就需要用import语法导入某个包下的隐式转换函数。通常建议,仅仅在需要隐式转换的某个函数或方法里导入,这样可以缩小隐式转换函数的作用域,避免不必要的隐式转换。
4、隐式转换发生的时机
1)调用某个函数或对象的方法时,但是传入的参数类型与函数或方法的参数类型不匹配的情况;
2)使用某个对象的方法,而这个对象不存在这个方法时;
5、隐式参数
隐式参数,是指在函数或方法中,定义一个用implicit修饰的参数,此时,Scala会尝试找到一个指定类型的,用implicit修饰的对象,即隐式值,并注入参数
示例代码如下:
class SignPen(){
def write(content:String)=println(content)
}
object Main{
implicit val signPen = new SignPen
def signForExample(name:String)(implicit signPen: SignPen){
signPen.write(name + " come to exam in time.")
}
def main(args: Array[String]): Unit = {
signForExample("lero")
}
}