要素が である必要がある Java コレクション ライブラリで Scala タプルを使用しようとしていますComparable。Scala の最近のバージョンでは、タプルを辞書順に並べることができることを知ってい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)