隱式類
隱式類使得可以向先前定義的類新增新方法。
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
的新例項。