代码之家  ›  专栏  ›  技术社区  ›  Reactormonk

impicit排序和协方差

  •  2
  • Reactormonk  · 技术社区  · 10 年前
    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 回复  |  直到 10 年前
        1
  •  3
  •   Sean Vieira    10 年前

    简单的答案是, 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
    }
    
        2
  •  2
  •   Reactormonk    10 年前

    通过@Daunnc:

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