1

要素が である必要がある Java コレクション ライブラリで Scala タプルを使用しようとしていますComparableScala の最近のバージョンでは、タプルを辞書順に並べることができることを知っていmath.Ordering.Implicitsます。Ordering[T]ただし、Scalaから 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 に答える