隐式排序和协方差
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]
没有关系,即使 Bar
是Foo
.
的子类
您可以为 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 }
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]
没有关系,即使 Bar
是Foo
.
您可以为 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 }