【发布时间】:2015-10-17 13:52:04
【问题描述】:
我有一个案例类,像这样:
case class Container[T, M](value: T, modifier: M)
我想让那些T 也有Ordering 的Container 上的Ordering 成为可能。我不想创建T <: Ordered[T],因为Container 也应该能够包含不可排序的值。
我的第一次尝试是实现Ordered,如下所示:
case class Container[T, M](value: T, modifier: M) extends Ordered[Container[T, M]] {
override def compare(that: Container[T, M])(implicit ev: Ordering[T]): Int = ev.compare(value, that.value)
}
但这显然行不通:由于implicit 参数,compare 不再实现该特征。
于是我决定尝试一种类型类的方法:
class ContainerOrdering[T, M](implicit ev: Ordering[T]) extends Ordering[Container[T, M]] {
override def compare(x: Container[T, M], y: Container[T, M]): Int = ev.compare(x.value, y.value)
}
implicit object ContainerOrderingInt extends ContainerOrdering[Int, Int]
这可行(如果我也有import Ordering.Implicits._),但现在我有一个新问题:对于每个类型M,我都需要一个单独的隐式对象。现在我不想在M 位置使用太多类型(事实上,它们都源自我在别处定义的密封特征),但这仍然意味着我需要的隐式对象的组合爆炸定义。我可以为每个 T 设置一个单独的隐式对象,但 M 确实应该与此正交。
必须有更好的方法来做到这一点。也许我可以利用M 扩展密封特征的事实。但是,我一直无法这样做。有什么建议吗?
【问题讨论】: