Snažím sa použiť kód podobný
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
}
Keď to skúsim v programe Scala 2.11 REPL
scala> import scala.collection.immutable.SortedSet
scala> SortedSet[B]()
Mám nasledujúcu chybu
<console>:11: error: diverging implicit expansion for type Ordering[B]
starting with method ordered in trait LowPriorityOrderingImplicits
SortedSet[B]()
Ako to môžem vyriešiť?
odpovede:
2 pre odpoveď č. 1Potrebujete inštanciu súboru Ordering
typ triedy vytvoriť SortedList
, ordered
metóda uvedená v chybovom hlásení automaticky vytvorí Ordering[X]
pre akýkoľvek typ X
to je Ordered[X]
.
tvoj B
nie je Ordered[B]
, však - len sa rozširuje Ordered[A[Int]]
. Ordered
je invariantný vo svojom type argument, tak Ordered[B]
a Ordered[A[Int]]
nemajú v podstate nič spoločné.
S týmto problémom môžete riešiť Fpolymorfizmus:
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
}
teraz B
predlžuje Ordered[B]
a môžete vytvoriť triedenú sadu. Prípadne môžete použiť pôvodný kód a len vytvoriť SortedSet[A[Int]]
, Je to oveľa lepší nápad sa vyhnúť Ordered
úplne, ale len definovať Ordering
typ inštancie triedy priamo.