我有以下类层次结构:
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)&gt; A(1)因为新的B(2)。值&gt;新的A(1).value
请帮忙!
答案 0 :(得分: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
中定义它,这将使其一直可用,无需导入。
答案 1 :(得分: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