在 Scala 中设计通用特征

Design a generic trait in Scala

最近在学习数据结构。有一种情况,我想设计一个通用特征,该类型应该支持可比性。如果我需要设计一个通用的class,我可以像下面这样设计:

class SortedType [A: Ordering](val x: A)
val x = new SortedType(3)
val y = new SortedType("Hello, World!")

但是,由于在 scala 中,trait 不能有带有上下文边界的参数,所以我不能定义这样的 trait trait SortedType[A: Ordering]。我如何设计特征以使其对泛型类型的支持具有可比性? 感谢您的慷慨建议!

约束 [A: Ordering] 没有说明类型 A 本身的任何信息。相反,它指定存在类型 Ordering[A] 的(隐式)实例。保证 Ordering[A] 类型实例存在的最简单方法是简单地提供一个方法 def ord: Ordering[A].

因此,您可以将排序设为 trait 的成员,然后接受排序作为工厂方法参数:

trait SortedStuff[A] {
  def ord: Ordering[A]
  def x: A
}

object SortedStuff {
  def apply[A: Ordering](a: A) = new SortedStuff[A] {
    def ord = implicitly
    def x = a
  }
}

请注意,只有当 SortedStuff 是某种应该在一大堆 A 上运行的模块时,这才有意义。将 Ordering 附加到 A 的单独元素没有任何意义 - 排序是 元素之间的关系,而不是每个孤立的 属性元素.