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