1.什么是隱式轉換和隱式參數?
隱式轉換是以implicit 聲明的帶有單個參數的函數
隱式參數是函數或方法帶有一個標記為implicit 的參數列表
隱式轉換函數是在同一個作用域下,一個給定輸入類型并自動轉換為制定返回類型的函數,這個函數和函數名字無關,和入參名字無關,只和入參類型及返回類型有關.
2.隱式轉換有設么作用?
- 隱式轉換可以用于類型之間做轉換
implicit def int2Fraction(n : Int) = Fraction(n,1)
val result = 3 * Fraction(4,5)
Int 3 被轉換成一個Fraction對象
- 可以豐富現有類的功能
class RichFile( val from : File){
def read = Source.fromFile(from.getPath).mkString
}
implicit def file2RichFIle(from: File) = new RichFile(from)
new File("README")'.read //調用file2RichFile 因為File 沒有read 方法
- 隱式對象可以自動被呼出用于執(zhí)行轉換或其他任務
- 什么情況下會調用隱式轉換?
- 表達式類型與預期類型不同
- 當對象訪問一個不存在的成員時:
- 當對象調用某個方法,而該方法的參數聲明與傳入參數不匹配
- 隱式參數用在哪里?
使用Curying定義一個隱式調用函數
case calss Delimilters(left : String, right: String)
def quote(what: String)(implicit delims: Delimiters) =delims.left + what + delims.right
如果調用quote函數時,附加隱式函數,則自動在系統中尋找類型為Delimiters的隱式值.
implicit val quoteDelimiters = Delimiters("<",">")
quote( "test for this") // 實際上運行的是 quote("test for this")(Delimiters("<",">"))