Je rencontre des problèmes pour étendre une classe de base étendue [Commandé] [Base]. Ma classe dérivée ne peut pas s'étendre Ordered [Derived] donc ne peut pas être utilisée comme une clé dans une TreeMap. Si je crée une TreeMap [Base], puis juste remplacer la comparaison dans Derived qui fonctionne, mais ce n'est pas ce que je veux. Je voudrais pouvoir avoir la classe dérivée comme clé. Y a-t-il un moyen de contourner ceci?Étendre la classe scala qui s'étend en ordre
case class A(x: Int) extends Ordered[A] {
def compare(that: A) = x.compare(that.x)
}
// Won't compile
// case class B(val y : Int) extends A(1) with Ordered[B] {
// def compare(that: B) = x.compare(that.x) match {
// case 0 => y.compare(that.y)
// case res => res
// }
// }
// Compiles but can't be used to define a TreeMap key
case class B(y: Int) extends A(1) {
override def compare(that: A) = that match {
case b: B => x.compare(b.x) match {
case 0 => y.compare(b.y)
case res => res
}
case _: A => super.compare(that)
}
}
def main(args: Array[String]) {
TreeMap[B, Int]() // Won't compile
}
Modifier
This discussion sur la liste de diffusion scala semble être très pertinent, mais il me perd un peu.
Merci pour l'aide Thomas. J'espérais qu'il y aurait un peu de magie Scala que j'avais raté qui permettait à ça de fonctionner. Sans recourir essentiellement à un passage dans un comparateur. Est-ce que c'est juste moi ou cela semble-t-il très limitant, et assez ennuyeux? Ou est-ce juste à prévoir? – Dave
Lorsque vous travaillez avec Ordered [T], vous êtes généralement supposé utiliser la relation <% pour demander que vous vouliez une vue qui commande l'objet. Si vous ne tapez pas, par exemple Int (qui n'élargit pas AnyRef, donc ils ne peuvent pas implémenter de traits), cela ne fonctionnera pas non plus avec votre conteneur. Notez que cette réponse ne concerne que Scala 2.7 –
@Dave - J'ai ajouté une version de conversion de type implicite. Ce n'est pas parfait car une distribution est nécessaire. –