Неявное преобразование для иерархии классов с параметризованными типами в Scala? - PullRequest
1 голос
/ 09 марта 2012

У меня есть следующая иерархия классов:

class A[T](val value: T)
class B[T](value: T) extends A[T](value)

Я хочу определить неявные преобразования и упорядочения для иерархии, чтобы иметь возможность сравнивать экземпляры следующим образом:

new A(1) < new A(2)
new B(2) > new A(1)

и т. Д.

Упорядочение должно основываться на упорядочении полей значений. новый B (2)> A (1), потому что новый B (2) .value> новый A (1) .value

Пожалуйста, помогите!

Ответы [ 2 ]

2 голосов
/ 09 марта 2012
scala> class A[T](val value: T)
defined class A

scala> class B[T](value: T) extends A(value)
defined class B                                                          

scala> implicit def xord[T : Ordering] = Ordering.by((_: A[T]).value)
xord: [T](implicit evidence$1: Ordering[T])scala.math.Ordering[A[T]]

scala> import Ordering.Implicits._
import Ordering.Implicits._

scala> new A(1) < new A(2)
res2: Boolean = true

scala> new B(1) < new A(2)
res3: Boolean = true

scala> new B(2) < new A(1)
res4: Boolean = false
2 голосов
/ 09 марта 2012

Вы не говорите, что должно происходить между B(1) и A(1). Предположим, они равны

object A {
  implicit def orderingOfA[T : Ordering] : Ordering[A[T]] = Ordering.by(_.value)
}

Подтип B в основном не имеет значения, упорядочение имеет значение A, и оно также должно упорядочивать экземпляры B, поскольку они являются экземплярами A. Даже если вы решите, что значение B изменит сравнение (возможно, оно нарушит связь), вынудите вас написать собственный заказ, но все же в том же месте, с той же подписью.

Конечно, порядок определяется только тогда, когда заказ доступен на T (следовательно, [T : Ordering]). И лучше всего определить его в компаньоне object A, который сделает его доступным постоянно, без импорта.

...