隐式排序和协方差

impicit Ordering and covariance

class Foo
class Bar extends Foo
implicit val ord = new math.Ordering[Foo] {
  override defcompare(a: Foo, b: Foo) = 0
}

尝试调用 Bar 的 Ordering 实例时

implicitly[math.Ordering[Bar]]

失败

No implicit Ordering defined for Bar.

我希望它能获取我在 Foo 上定义的实例。

简短的回答是,math.Ordering[T]T 上不变,因此 math.Ordering[Foo]math.Ordering[Bar] 没有关系,即使 BarFoo.

的子类

您可以为 Ordering[T] 实例提供一个隐式工厂来解决这个问题,正如@DaunnC 在评论中指出的那样:

implicit def ord[A <: Foo] = new math.Ordering[A] {
  override def compare(a: A, b: A) = 0
}

来自@Daunnc:

implicit def ord[A <: Foo] = new math.Ordering[A] { override def compare(a: A, b: A) = 0 }