隐式排序和协方差

时间:2015-03-08 06:05:40

标签: scala implicit

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上定义的实例。

2 个答案:

答案 0 :(得分:3)

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

您可以为implicit def ord[A <: Foo] = new math.Ordering[A] { override def compare(a: A, b: A) = 0 } 个实例提供一个隐式工厂来解决这个问题,正如@DaunnC在评论中指出的那样:

{{1}}

答案 1 :(得分:2)

通过@Daunnc:

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