在Scala中设计通用特征

时间:2019-03-29 14:14:08

标签: scala generics traits

我最近正在学习数据结构。在某些情况下,我想设计一个通用特征,该特征应支持可比性。如果需要设计泛型类,可以进行如下设计:

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

但是,由于在scala中,特征不能具有带有上下文范围的参数,因此我无法定义这样的特征trait SortedType[A: Ordering]。如何设计特征,以便其通用类型可比? 感谢您的慷慨建议!

1 个答案:

答案 0 :(得分:3)

约束[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的单独元素上没有任何意义-顺序是元素之间的关系 ,而不是每个孤立元素的属性。