你說得對,只是實現字符串的Numeric將不起作用,因爲sum方法被定義爲返回數字定義的類型,這將是一個字符串。
也許像這樣?
trait SummableAsInt[A] {
def plus(n: Int, a: A): Int
}
def sumListAsInt[A, B >: A](xs: List[A])(implicit s: SummableAsInt[B]): Int = {
xs.foldLeft(0)(s.plus)
}
implicit val StringSumAsInt: SummableAsInt[String] = new SummableAsInt[String] {
def plus(n: Int, s: String): Int = s.length + n
}
而且它可以像使用:
sumListAsInt(List("abc", "def", "ghi"))
如果你想在同一x.sum
語法,而不是sum(x)
,你可以用,而不是一個隱含的類做到這一點:
implicit class ListOps[A](xs: List[A]) [
def sumAsInt[B >: A](implicit s: SummableAsInt[B]): Int = {
xs.foldLeft(0)(s.plus)
}
}
List("abc", "def", "ghi").sumAsInt
感謝@喬-K。你發佈的anwser應該工作,謝謝 – Tom