【发布时间】:2013-10-22 19:58:14
【问题描述】:
我正在尝试在 Java 集合库中使用 Scala 元组,该集合库要求其元素为 Comparable。我知道最新版本的 Scala allow lexicographical ordering of tuples 到 math.Ordering.Implicits。但是,似乎不存在从 Scala 的 Ordering[T] 到 Java 的 Comparable[T] 的默认转换。无论我是否导入了元组排序,我都会收到错误 java.lang.ClassCastException: scala.Tuple2 cannot be cast to java.lang.Comparable。
有没有办法自动将Ordered 或Ordering 类型转换为Comparable?如果没有,是否可以更具体地以字典方式制作元组Comparable?我正在寻找比创建实现 Comparable 的自定义案例类更好的东西,以提高通用性并减少样板和排版噪音((a, b, c) 比 BeanLikeClassWithComparable(a, b, c) 更清晰、更容易键入)。
编辑:
我尝试使用J Cracknell's solution,但无济于事(我收到与上述相同的错误)。我已经发布了Wrapped 类的尝试实现;对于pair来说,这是一个不太通用的实现,而且似乎不起作用。
import scala.math.Ordering.Implicits._
case class OrderedPair[A <: Ordered[A], B <: Ordered[B]](elem: (A, B))
extends Ordered[OrderedPair[A, B]] {
override def compare(that: OrderedPair[A, B]): Int =
implicitly[Ordering[(A, B)]].compare(this.elem, that.elem)
}
implicit def tuple2ToOrdered[A <: Ordered[A], B <: Ordered[B]](x: (A, B)) = OrderedPair(x)
【问题讨论】:
标签: java scala implicit-conversion