我对使用Ordering
的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对象可能会出现这种情况?
答案 0 :(得分:8)
Ordering
(与Ordered
相对)与比较类型分开。它等同于java Comparator
,而不是Comparable
。因此,您只需将术语定义为单例,继承Term
就没有问题。
implicit object TermOrdering extends Ordering[Term] {
def compare(t1: Term, t2: Term: Term): Int = ....
}
更好地将其标记为隐式,因为将它放在隐式范围内会很方便。然后,您必须确保在调用某些需要它的操作时导入TermOdering
。
P.S。你应该阅读Daniel Sobral的这篇伟大的answer。