4

私はOrdering'sを使用したScalaでのソートにある程度慣れていますが、Javaで定義されているいくつかのオブジェクトをソートしたいと思います。それらはComparable(ではなくComparable[T])そしてfinal

final class Term implements Comparable { ... }

(これは実際にはLuceneのTermクラスであり、Luceneのバージョンを変更することはできません)。

私は最初、暗黙のどこかにあることを望みました:

terms.sorted //fail - no implicit ordering

だから多分私はそれを注文することができますか?

class OrderedTerm extends Term with Ordering[Term] //fail - class is final

この後、私は使用の厄介さに頼ると思いましたjava.util.Collections.sort

Collections.sort(terms) // error: inferred type arguments [org.apache.lucene.index.Term] do not conform to method sort's type parameter bounds [T <: java.lang.Comparable[_ >: T]]

したがって、Scalaは型パラメーターに厳密であるため、これでも機能しないようです。この時点で、2つの方法がわかります。別の明示的な順序を再実装する(悪い)か、Javaでソートを記述する(それほど悪くはない)。

Scalaでこれをきれいに行う方法はありますか?この状況は、レガシーJavaオブジェクトを使用する場合に一般的である可能性があると思いますか?

4

1 に答える 1

8

Ordering(とは対照的にOrdered)は、比較されたタイプとは別のものです。Comparatorこれは、ではなくjavaと同等Comparableです。したがって、Termsでの注文をシングルトンとして定義するだけで、継承に問題はありませんTerm

implicit object TermOrdering extends Ordering[Term] {
  def compare(t1: Term, t2: Term: Term): Int = ....
}

暗黙のスコープに含めると便利なため、暗黙のマークを付けることをお勧めします。次に、それTermOderingを必要とする操作を呼び出すときに、それがインポートされていることを確認する必要があります。

PSあなたはダニエルソブラルによるこの素晴らしい答えを読むべきです。

于 2011-11-04T07:46:08.630 に答える