我对 Scala 中的排序有点熟悉Ordering
的,但是我想对 Java 中定义的一些对象进行排序。他们是Comparable
(not Comparable[T]
) and 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 对象时可能很常见?
Ordering
(相对于Ordered
) 与比较类型分开。相当于javaComparator
, not Comparable
。所以你只需将Terms上的ordering定义为单例,继承就没有问题Term
.
implicit object TermOrdering extends Ordering[Term] {
def compare(t1: Term, t2: Term: Term): Int = ....
}
最好将其标记为隐式,因为将其置于隐式范围内会很方便。那么你只需要确保TermOdering
当您调用某些需要它的操作时会导入。
附:你应该读一下这篇很棒的文章answer https://stackoverflow.com/questions/4465948/what-are-scala-context-and-view-bounds/4467012#4467012作者:丹尼尔·索布拉尔。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)