在处理 this question 时,我想到了以下问题。考虑两个方法定义:

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(_<=_)

在编译匿名函数时,编译器将隐式转换应用于 find 方法 <= ,一切正常。

我没有另一个例子,但可以想象类似的问题发生在集合上的其他函数中,这些函数需要元素具有某些属性,如果这些只能通过转换断言的话。

编译器以这种方式受到限制是否有特殊原因?有没有通用的方法来解决这些问题? (在这里似乎很容易。)是否有解决方法,例如将 Key[T] 上的属性转换为 T 的另一个隐式转换?

(请注意,如果 T 的具体值最终具有该属性,则最后一个想法可能会出现问题;然后我们会得到一个模棱两可的情况)。

最佳答案

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]

10-08 17:40