在Scala中,我们可以使用至少两种方法来改进现有或新类型.假设我们想要表达某些东西可以使用a来量化Int.我们可以定义以下特征.
trait Quantifiable{ def quantify: Int }
Run Code Online (Sandbox Code Playgroud)
然后我们可以使用隐式转换来量化例如字符串和列表.
implicit def string2quant(s: String) = new Quantifiable{
def quantify = s.size
}
implicit def list2quantifiable[A](l: List[A]) = new Quantifiable{
val quantify = l.size
}
Run Code Online (Sandbox Code Playgroud)
导入这些后,我们可以quantify在字符串和列表上调用该方法.请注意,可量化列表存储其长度,因此它可以避免在后续调用时对列表进行昂贵的遍历quantify.
另一种方法是定义一个"证据" Quantified[A],表明某种类型A可以量化.
trait Quantified[A] { def quantify(a: A): Int }
Run Code Online (Sandbox Code Playgroud)
然后,我们提供这种类型的类的实例为String和List地方.
implicit val stringQuantifiable = new Quantified[String] {
def quantify(s: String) = s.size
}
Run Code Online (Sandbox Code Playgroud)
如果我们编写一个需要量化其参数的方法,我们写道:
def sumQuantities[A](as: List[A])(implicit ev: Quantified[A]) =
as.map(ev.quantify).sum …Run Code Online (Sandbox Code Playgroud)