使用SortedSet分散隐式扩展错误

时间:2014-05-04 17:14:49

标签: scala implicit-conversion sortedset

我试图使用类似于

的代码
abstract class A[T] extends Ordered[A[T]] {
  val att:Int

  def compare(that:A[T]) = 
    if (this.att >= that.att)
       1
    else
      -1
}

class B extends A[Int] {
  val att = 1
}

当我在Scala 2.11 REPL中尝试此操作时

scala> import scala.collection.immutable.SortedSet
scala> SortedSet[B]()

我收到以下错误

<console>:11: error: diverging implicit expansion for type Ordering[B]
starting with method ordered in trait LowPriorityOrderingImplicits
          SortedSet[B]()

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您需要Ordering类型类的实例来创建SortedList。错误消息中提到的ordered方法会自动为Ordering[X]的任何类型X创建Ordered[X]

您的B不是Ordered[B],但它只会延伸{​​{1}}。 Ordered[A[Int]]在其类型参数中不变,因此OrderedOrdered[B]基本上没有任何关系。

您可以使用F-bounded polymorphism解决此问题:

Ordered[A[Int]]

现在abstract class A[T, S <: A[T, S]] extends Ordered[S] { val att: Int def compare(that: S)= if (this.att >= that.att) 1 else -1 } class B extends A[Int, B] { val att = 1 } 扩展B,您可以创建有序集。 或者,您可以使用原始代码并创建Ordered[B]。但是,完全避免使用SortedSet[A[Int]]更好,只需直接定义Ordered类型类实例。