多态 class 排序的发散隐式扩展

diverging implicit expansion on ordering of polymorphic class

为什么我在以下代码中遇到 diverging implicit expansion 编译器异常?

trait Person extends Ordered [Person] {
    def age: Int
    def compare (that: Person) = this.age.compare(that.age)
}

class Dinner[A <: Person](val people: Seq[A]) {
    def who = people.sorted
}


<console>:16: error: diverging implicit expansion for type scala.math.Ordering[A]
starting with method $conforms in object Predef
           def who = people.sorted
                            ^

好的,我可以使用 people.sorted[Person] 但我为什么要使用,A 是它的子类。

您指定了如何比较 Person,但没有为 A <: Person 进行比较,在 people.sorted 中,编译器必须知道如何进行比较。

尝试

trait Person extends Ordered [Person] { 
  def age: Int
  def compare(that: Person): Int = implicitly[Ordering[Person]].compare(this, that)
}

implicit def personOrdering[A <: Person]: Ordering[A] = (x, y) => x.age.compare(y.age)

class Dinner[A <: Person](val people: Seq[A]) {
  def who: Seq[A] = people.sorted
}

case class PersonImpl(age: Int) extends Person
val dinner = new Dinner[PersonImpl](Seq(PersonImpl(30), PersonImpl(20)))
dinner.who // List(PersonImpl(20), PersonImpl(30))