【发布时间】:2011-01-26 10:29:11
【问题描述】:
Scala 有许多可以用作类型类的特征,例如 scala.math 包中的 Ordered 和 Numeric。
例如,我可以像这样使用Ordered 编写一个通用方法:
def f[T <% Ordered[T]](a: T, b: T) = if (a < b) a else b
我想对Numeric 做类似的事情,但这不起作用:
def g[T <% Numeric[T]](a: T, b: T) = a * b
为什么Ordered 和Numeric 之间存在明显差异?
我知道还有其他方法可以做到这一点,以下将起作用(使用上下文绑定):
def g[T : Numeric](a: T, b: T) = implicitly[Numeric[T]].times(a, b)
但这看起来比仅仅使用* 将两个数字相乘更复杂。为什么Numeric trait 不包含* 之类的方法,而Ordered 包含< 之类的方法?
我知道还有Ordering,你可以像Numeric一样使用它,另见this answer:
def f[A : Ordering](a: A, b: A) = implicitly[Ordering[A]].compare(a, b)
【问题讨论】: