У меня возникли проблемы с расширением базового класса, который расширяет упорядоченный [Base]. Мой производный класс не может расширять Ordered [Derived], поэтому его нельзя использовать в качестве ключа в TreeMap. Если я создам TreeMap [Base], а затем просто переопределяю сравнение в Derived, которое работает, но это не то, что я хочу. Я хотел бы иметь возможность иметь производный класс в качестве ключа. Есть ли способ обойти это?Расширить класс scala, который распространяется по заказу
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
}
Редактировать
This discussion в списке рассылки кажется Scala очень актуальным, но она теряет меня немного.
Спасибо за помощь Томас. Я надеялся, что может быть какая-то магия Scala, которую я пропустил, и это позволило ей работать. Не прибегая к существенному прохождению в компараторе. Является ли это только мне или это кажется очень ограниченным и весьма раздражающим? Или это можно ожидать? – Dave
При работе с Ordered [T] вы обычно должны использовать связь <%, чтобы запросить, чтобы вы хотели, чтобы объект, который заказывает объект. Если вы этого не сделаете, такие типы, как Int (которые не распространяют AnyRef, поэтому они не могут реализовать какие-либо черты), также не будут работать с вашим контейнером. Обратите внимание, что этот ответ касается только Scala 2.7 –
@Dave - я добавил неявную версию преобразования типов. Это не идеально, так как требуется бросок. –