在Scala中使用参数化类型进行类层次结构的隐式转换?

时间:2012-03-09 10:11:36

标签: scala implicit-conversion

我有以下类层次结构:

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

请帮忙!

2 个答案:

答案 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