1

我正在尝试在 Java 集合库中使用 Scala 元组,该库要求其元素为Comparable. 我知道最近版本的 Scala允许通过math.Ordering.Implicits. 但是,看起来不存在从 ScalaOrdering[T]到 Java 的默认转换Comparable[T]。无论我是否导入了元组排序,我都会收到错误消息java.lang.ClassCastException: scala.Tuple2 cannot be cast to java.lang.Comparable

有没有办法自动将OrderedorOrdering类型转换为Comparable?如果没有,是否可以更具体地Comparable以字典方式制作元组?我正在寻找比创建自定义案例类更好的东西,以实现Comparable更多通用性并减少样板和印刷噪音((a, b, c)比 更清洁和更容易键入BeanLikeClassWithComparable(a, b, c))。

编辑:我尝试使用J Cracknell 的解决方案,但无济于事(我收到与上述相同的错误)。我已经发布了Wrapped该类的尝试实现;对于配对来说,这是一个不太通用的实现,并且似乎不起作用。

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)
4

1 回答 1

1

任何A存在隐式可隐Ordering[A]式转换为Ordered[A] <: Comparable[A]提供scala.math.Ordered的类型都在隐式转换的范围内。不幸的是,基础价值在转换过程中丢失了,所以我怀疑这是否能满足您的需求。

如果您想继续使用 scala 的排序,您很可能需要创建一个数据结构来捕获主题及其隐式排序:

case class Wrapped[A](elem: A)(implicit ordering: Ordering[A])
  extends Ordered[Wrapped[A]]
{
  def compare(that: Wrapped[A]): Int = ordering.compare(this.elem, that.elem)
}
于 2013-10-22T21:27:34.240 回答