Scala隱式轉換可分爲三種類型:隱式參數、隱式類型轉換、隱式類。其中,隱式類只能定義在單例對象/伴生對象中,筆者還沒想到很好的使用場景,本篇不做案例。
案例一、隱式參數
package basic
object ImplicitParameter extends App {
def add(a:Int)(implicit b:Int,c:Int) = a + b + c
implicit val a = 2;
//implicit val b = 3;
println(add(1))
}
上述add方法屬於柯里化高階方法,參數b和c被implicit關鍵字修飾,在執行期間,編譯器會在上下文中尋找類型爲Int的隱式參數。
注意:
- 如果上下文中出現兩個符合要求的隱式參數,則會拋出異常。
- add方法的形參,implicit只能修飾最後一個括號中的參數,否則編譯不過。
案例二、隱式類型轉換
隱式類型轉換,可以很方便的增強類的功能,如下案例,java.io.File並沒有提供count方法,我們可以通過該方式,給File類提供count功能。(有點兒裝飾器模式的味道)
/**
File裝飾類
*/
class AdvancedFile(file:File){
/*
val count = ()=>{
Source.fromFile(file).getLines().length
}*/
def count()={
val input = new BufferedReader(new InputStreamReader((new FileInputStream(file))))
input.lines().count()
}
}
object ImplicitDemo extends App{
val file = new File("/Users/chenyuedong/Desktop/IT/test/familyname.pages")
println(file.exists())
implicit def fileToAdvancedFile(file:File) = new AdvancedFile(file)
println(file.count())
}