Работая над этим вопросом , я предложил следующую проблему. Рассмотрим два определения метода:
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
в конечном итоге будет иметь свойство; тогда мы получим неоднозначную ситуацию).