【问题标题】:Implicit conversion from TupleN to Comparable从 TupleN 到 Comparable 的隐式转换
【发布时间】:2013-10-22 19:58:14
【问题描述】:

我正在尝试在 Java 集合库中使用 Scala 元组,该集合库要求其元素为 Comparable。我知道最新版本的 Scala allow lexicographical ordering of tuplesmath.Ordering.Implicits。但是,似乎不存在从 Scala 的 Ordering[T] 到 Java 的 Comparable[T] 的默认转换。无论我是否导入了元组排序,我都会收到错误 java.lang.ClassCastException: scala.Tuple2 cannot be cast to java.lang.Comparable

有没有办法自动将OrderedOrdering 类型转换为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


    【解决方案1】:

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

    如果您想继续使用 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)
    }
    

    【讨论】:

    • 谢谢。我不确定这对于可能实际存储在集合中的值意味着什么,因为它们会在插入之前被包装。它似乎也不起作用(参见上面的编辑)。
    • 您如何输入您的收藏?它需要是Coll[Wrapped[A]],这个想法是Wrapped[A] 实现Comparable,同时仍然提供对存储的A 的引用(在你的情况下是一个元组)。
    猜你喜欢
    • 2011-08-25
    • 2016-05-19
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 2013-05-01
    相关资源
    最近更新 更多