Прежде всего, Ordering
сродни Comparator
, а не Comparable
.Scala, эквивалентный Comparable
, равен Ordered
.Далее extends
эквивалент <:
, а не >:
.Последнее эквивалентно super
- T super COmparable<T>
, что не то, что вы хотите.Итак, с обоими этими исправлениями ваш код должен выглядеть следующим образом:
def myMethod[A <: Ordered[A]](values: Seq[A]): Seq[A] = {
// ...
val sorted = values.sorted
//
}
Однако это не сработает, например, для Seq[Int]
, поскольку Int
не расширяет Ordered
-- точно так же, как Java int
не расширяет Comparable
(или что-то еще, поскольку это не класс).
В Scala есть обходной путь - неявное преобразование определенных классов вOrdered
класс.Однако, чтобы использовать это, вам нужно использовать границы представления , что бы код выглядел так:
def myMethod[A <% Ordered[A]](values: Seq[A]): Seq[A] = {
// ...
val sorted = values.sorted
//
}
См. <%
вместо <:
?Это граница вида.
Теперь в кругах Scala предпочтение отдается границам контекста вместо границ вида, поскольку они более гибкие.Это будет означать использование Ordering
, как описано в других ответах.