在Scala中对未绑定的可比较进行排序

jpg*_*jpg 4 scala comparable

我对使用Orderings的Scala中的排序有些熟悉,但是我想对一些用Java定义的对象进行排序.他们是Comparable(不Comparable[T])和final:

final class Term implements Comparable { ... }
Run Code Online (Sandbox Code Playgroud)

(这实际上是Lucene的Term类,不,我不能改变Lucene的版本).

我首先希望有一个隐含的地方:

terms.sorted //fail - no implicit ordering
Run Code Online (Sandbox Code Playgroud)

也许我可以订购它?

class OrderedTerm extends Term with Ordering[Term] //fail - class is final
Run Code Online (Sandbox Code Playgroud)

在此之后,我想我会诉诸于使用的肮脏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]]
Run Code Online (Sandbox Code Playgroud)

所以看起来即使这不起作用,因为Scala严格遵守它的类型参数.在这一点上,我可以看到两种方法:重新实现另一个显式排序(坏)或在Java中编写排序(不是那么糟糕).

有没有办法在Scala中干净利落地做到这一点?我假设使用旧Java对象可能会出现这种情况?

Did*_*ont 8

Ordering(与之相反Ordered)与比较类型分开.它相当于java Comparator,而不是Comparable.因此,您只需将术语定义为单例,对继承没有任何问题Term.

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

更好地将其标记为隐式,因为将它放在隐式范围中会很方便.然后,您必须确保TermOdering在调用某些需要它的操作时导入.

PS你应该阅读Daniel Sobral的这个伟大的答案.