我的动机是我想要一个用于排序函数的抽象类。现在看起来像:
abstract class Sorter[A <% Ordered[A]]{
def apply(xs: Seq[A]): Seq[A]
}
但我不确定如何制作一个具体的例子,即:
val mySort = new Sorter {
def apply(xs: Seq[A]) = { ... }
}
我想我的问题是双重的:
我的抽象类是否正确?
如何参数化mySort
?
答案 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中,我没有看到需要抽象类(或特征)来订购东西。
集合已定义sorted
和sortBy
方法。因此,当您拥有col
A
的集合时,如果您在范围内隐含col.sorted
,则可以使用Ordering[A]
对其进行排序。
由您来决定Ordering
是否是您想要的,或者是否需要抽象类和具体实现。
请注意,您始终可以实现自定义Ordering
,例如:
new Ordering[Int] {
override def compare(x: X, y: X) = ???
}