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)