Я пытаюсь выяснить, как выразить приведенный ниже код, используя абстрактные типы вместо использования параметров типа.
trait Key[T] extends Ordered[Key[T]] {
val key:T
}
case class DoubleKey(key:Double) extends Key[Double] {
def compare(that:Key[Double]):Int = this.key compare that.key
}
Моя текущая версия выглядит следующим образом:
trait Key extends Ordered[Key] {
type K
val key:K
}
case class DoubleKey(val key:Double) extends Key {
type K = Double
def compare(that:Key):Int = this.key compare that.key.asInstanceOf[K]
}
Но я не доволен явным приведением к типу K: that.key.asInstanceOf[K]
. Есть ли лучшие / другие способы добиться упорядочения абстрактного члена с использованием абстрактных типов?
Я также пытался убедиться, что тип that:Key
является Double
:
def compare(that:Key { type K = Double } ):Int = this.key compare that.key
но это также не помогает, так как компилятор не считает, что сравнение определено. Кроме того, существует ли решение, в котором compare
можно переместить в ключ черты, ограничив K (например, type K <: Ordered[K]
)?