Как коллекции могут использовать неявные преобразования для типов элементов? - PullRequest
4 голосов
/ 02 февраля 2011

Работая над этим вопросом , я предложил следующую проблему. Рассмотрим два определения метода:

def foo[T <: Ordered[T]](s : Seq[T]) = s.sorted

def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted

Первый компилируется, второй нет. Компилятор не понимает, что он может использовать утвержденное неявное преобразование для получения Ordering. Если мы немного поможем, это сработает:

def foo[T <% Ordered[T]](s : Seq[T]) = s.sortWith(_<=_)

При компиляции анонимной функции компилятор применяет неявное преобразование для поиска метода <=, все в порядке.

У меня нет другого примера, но я могу вообразить, что подобные проблемы могут возникать с другими функциями в коллекциях, которые требуют, чтобы элементы имели определенные свойства, если их можно утверждать только путем преобразования.

Есть ли конкретная причина, по которой компилятор ограничен таким образом? Нет ли общего способа решения таких проблем? (Здесь это кажется простым.) Есть ли обходной путь, например, другое неявное преобразование, которое переводит свойство Key[T] в T?

(Обратите внимание, что последняя идея может быть проблематичной, если конкретное значение для T в конечном итоге будет иметь свойство; тогда мы получим неоднозначную ситуацию).

Ответы [ 2 ]

4 голосов
/ 02 февраля 2011
scala> implicit def ordering[T <% Ordered[T]] = new Ordering[T]{def compare(x: T, y: T) = x compare y}
ordering: [T](implicit evidence$1: (T) => Ordered[T])java.lang.Object with Ordering[T]

scala> def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted
foo: [T](s: Seq[T])(implicit evidence$1: (T) => Ordered[T])Seq[T]
3 голосов
/ 03 февраля 2011
% scala29
Welcome to Scala version 2.9.0.r24168-b20110202012927 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.

scala> def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted
foo: [T](s: Seq[T])(implicit evidence$1: (T) => Ordered[T])Seq[T]

scala>

Кстати, «здесь это кажется легким», это не так.Подобные последствия могут отличаться, и они были довольно решительными.

...