Scala имеет ряд признаков, которые можно использовать в качестве классов классов, например Ordered
и Numeric
в пакете scala.math
.
Я могу написать, например, общий метод с помощью 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
не включает такие методы, как *
, а Ordered
включает такие методы, как <
?
Я также знаю Ordering
, который можно использовать так же, как Numeric
, см. также этот ответ:
def f[A : Ordering](a: A, b: A) = implicitly[Ordering[A]].compare(a, b)