我想为Scala.math.Ordering
创建一个简单的java.lang.Comparable
包装器实例。我认为这是标准的,但我在JavaConversions中看不到任何类似的内容。
有人可以这样做吗:
object ComparableOrdering[A <: Comparable[A]] extends Ordering[A] {
def compare(a: A, b: A): Int = a.compareTo(b)
}
实际上要处理像
这样的类
interface A {}
class B implements A, Comparable<A> {}
应该更像是:
object ComparableOrdering[A <: Comparable[B] with B] extends Ordering[A] {
def compare(a: A, b: A): Int = a.compareTo(b)
}
任何人都可以使用吗?
答案 0 :(得分:2)
标准库已经通过Ordering.ordered
提供了这些实例。例如,如果您有这样的类:
class Foo(val i: Int) extends Comparable[Foo] {
def compareTo(that: Foo): Int = this.i - that.i
}
您将自动拥有一个实例:
scala> Ordering[Foo].lt(new Foo(0), new Foo(1))
res0: Boolean = true
Ordering.ordered
的签名与您的签名不完全相同:
implicit def ordered[A](implicit arg0: (A) => Comparable[A]): Ordering[A]
这是有效的,因为标准库提供了隐式的“转换”函数,可以将任何类型转换为任何类型的超类型。
如果由于某种原因你想要定义自己的实例,你可以这样做:
implicit def comparableOrdering[A <: Comparable[A]]: Ordering[A] =
new Ordering[A] {
def compare(a: A, b: A): Int = {
println("Using custom instance for Comparable things")
a.compareTo(b)
}
}
然后:
scala> Ordering[Foo].lt(new Foo(0), new Foo(1))
Using custom instance for Comparable things
res0: Boolean = true
我猜测标准库没有以这种方式定义这些实例,原因与隐式优先级相关,但是Ordering
的实例是一团糟,以及他们为什么使用{{1}的问题方法可能不值得考虑。