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 对它的类型参数很严格。在这一点上,我可以看到两种方法:重新实现另一个显式排序(不好)或用 Java 编写排序(没那么坏)。

有没有办法在 Scala 中干净地做到这一点?我假设这种情况在使用遗留 Java 对象时可能很常见?

4

1 回答 1

8

Ordering(相对于Ordered)与比较类型是分开的。它相当于java Comparator,不是Comparable。因此,您只需将条款定义为单例,继承没有问题Term

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

最好将其标记为隐式,因为将其置于隐式范围内会很方便。然后,您只需确保TermOdering在调用某些需要它的操作时已导入它。

PS 你应该阅读 Daniel Sobral 的这个很棒的答案

于 2011-11-04T07:46:08.630 回答