隱式類

隱式類使得可以向先前定義的類新增新方法。

String 類沒有方法 withoutVowels。這可以像這樣新增:

object StringUtil {
  implicit class StringEnhancer(str: String) {
    def withoutVowels: String = str.replaceAll("[aeiou]", "")
  }
}

隱式類有一個建構函式引數(str),其中包含你要擴充套件的型別(String),幷包含你希望新增到該型別(withoutVowels)的方法。現在可以直接在增強型別上使用新定義的方法(當增強型別在隱式範圍內時):

import StringUtil.StringEnhancer // Brings StringEnhancer into implicit scope

println("Hello world".withoutVowels) // Hll wrld

在引擎蓋下,隱式類定義了從增強型別到隱式類的隱式轉換 ,如下所示:

implicit def toStringEnhancer(str: String): StringEnhancer = new StringEnhancer(str)

隱式類通常被定義為 Value 類, 以避免建立執行時物件,從而消除執行時開銷:

implicit class StringEnhancer(val str: String) extends AnyVal {
    /* conversions code here */
}

通過上面改進的定義,每次呼叫 withoutVowels 方法時都不需要建立 StringEnhancer 的新例項。