/ / Rozdiel v implicitnej chybe rozšírenia pomocou SortedSet - scala, implicitná konverzia, sortset

Rozlíšenie implicitnej chyby rozšírenia pomocou SortedSet - scala, implicitná konverzia, sortset

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ď č. 1

Potrebujete 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.