我试图使用类似于
的代码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]()
我该如何解决这个问题?
答案 0 :(得分:2)
您需要Ordering
类型类的实例来创建SortedList
。错误消息中提到的ordered
方法会自动为Ordering[X]
的任何类型X
创建Ordered[X]
。
您的B
不是Ordered[B]
,但它只会延伸{{1}}。 Ordered[A[Int]]
在其类型参数中不变,因此Ordered
和Ordered[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
类型类实例。