2012-03-09 4 views
1

я получил следующую иерархию классов:Неявное преобразование для иерархии классов с параметризованными типами в Scala?

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) .значение> новый A (1) .значение

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

ответ

2

Вы не скажите, что должно произойти между 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, который сделает его доступным все время без импорта.

+0

Спасибо! Оно работает. Ответ ниже также является приемлемым. Но ты был первым :) –

2
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 
+0

Спасибо! Он тоже работает! –

Смежные вопросы