如何使用视图绑定参数化类的实例?

时间:2017-08-27 00:17:04

标签: scala generics

我的动机是我想要一个用于排序函数的抽象类。现在看起来像:

abstract class Sorter[A <% Ordered[A]]{
  def apply(xs: Seq[A]): Seq[A]
}

但我不确定如何制作一个具体的例子,即:

val mySort = new Sorter {
  def apply(xs: Seq[A]) = { ... }
}

我想我的问题是双重的:

  1. 我的抽象类是否正确?

  2. 如何参数化mySort

1 个答案:

答案 0 :(得分:1)

查看边界是deprecated所以如果您不必使用它们,您可以写一些简单的内容:

  trait Sorter[A] {
    def sort(xs: Seq[A])(implicit ord: Ordering[A]): Seq[A]
  }

  new Sorter[Int] {
    override def sort(xs: Seq[X])(implicit ord: Ordering[X]): Seq[X] = {
      xs.sorted
    }
  }

Sorter是一个特质,但很可能是一个抽象类。参数化实例在括号之前完成,如示例所示。

另一方面,在Scala中,我没有看到需要抽象类(或特征)来订购东西。

集合已定义sortedsortBy方法。因此,当您拥有col A的集合时,如果您在范围内隐含col.sorted,则可以使用Ordering[A]对其进行排序。

由您来决定Ordering是否是您想要的,或者是否需要抽象类和具体实现。

请注意,您始终可以实现自定义Ordering,例如:

new Ordering[Int] {
    override def compare(x: X, y: X) = ???
  }