要素が である必要がある 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
。
Ordered
orOrdering
タイプをに自動的に変換する方法はあり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)