隐式类
隐式类使得可以向先前定义的类添加新方法。
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
的新实例。