泛型re:Scala.math.Ordering java.lang.Comparable的包装器实例

时间:2015-11-20 18:24:07

标签: scala generics

我想为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) }

任何人都可以使用吗?

1 个答案:

答案 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}的问题方法可能不值得考虑。