Scala提供的隱式轉(zhuǎn)換和隱式參數(shù)功能涧卵,允許你手動指定勤家,將某種類型的對象轉(zhuǎn)換成其他類型的對象,通過這些功能柳恐,可以實(shí)現(xiàn)非常強(qiáng)大而且特殊的功能伐脖。
scala的隱式轉(zhuǎn)換热幔,最核心的就是定義隱式轉(zhuǎn)換函數(shù),即implicit conversion function.
1讼庇、隱式轉(zhuǎn)換(案例:特殊售票窗口)
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绎巨、使用隱式轉(zhuǎn)換加強(qiáng)現(xiàn)有類型(案例:超人變身),類似于裝飾著模式
隱式轉(zhuǎn)換,可以為某個類定義一個加強(qiáng)版的類巫俺,并定義互相之間的隱式轉(zhuǎn)換认烁,從而讓源類在使用加強(qiáng)版的類的方法時,由scala自動進(jìn)行隱式轉(zhuǎn)換為加強(qiáng)類介汹,然后再調(diào)用該方法。
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舶沛、隱式轉(zhuǎn)換函數(shù)的作用域與導(dǎo)入
scala默認(rèn)會使用兩種隱式轉(zhuǎn)換:
1)一種是源類型或目標(biāo)類型的伴生對象內(nèi)的隱式轉(zhuǎn)換函數(shù)嘹承;
2)一種是當(dāng)前程序作用域內(nèi)的隱式轉(zhuǎn)換函數(shù);
如果隱式轉(zhuǎn)換函數(shù)不在以上兩種情況的花如庭,那么就需要用import語法導(dǎo)入某個包下的隱式轉(zhuǎn)換函數(shù)叹卷。通常建議,僅僅在需要隱式轉(zhuǎn)換的某個函數(shù)或方法里導(dǎo)入坪它,這樣可以縮小隱式轉(zhuǎn)換函數(shù)的作用域骤竹,避免不必要的隱式轉(zhuǎn)換。
4往毡、隱式轉(zhuǎn)換發(fā)生的時機(jī)
1)調(diào)用某個函數(shù)或?qū)ο蟮姆椒〞r蒙揣,但是傳入的參數(shù)類型與函數(shù)或方法的參數(shù)類型不匹配的情況;
2)使用某個對象的方法开瞭,而這個對象不存在這個方法時懒震;
5、隱式參數(shù)
隱式參數(shù)嗤详,是指在函數(shù)或方法中个扰,定義一個用implicit修飾的參數(shù),此時葱色,Scala會嘗試找到一個指定類型的递宅,用implicit修飾的對象,即隱式值苍狰,并注入?yún)?shù)
示例代碼如下:
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")
}
}