隐式类

隐式类使得可以向先前定义的类添加新方法。

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 的新实例。