我最近正在学习数据结构。在某些情况下,我想设计一个通用特征,该特征应支持可比性。如果需要设计泛型类,可以进行如下设计:
class SortedType [A: Ordering](val x: A)
val x = new SortedType(3)
val y = new SortedType("Hello, World!")
但是,由于在scala中,特征不能具有带有上下文范围的参数,因此我无法定义这样的特征trait SortedType[A: Ordering]
。如何设计特征,以便其通用类型可比?
感谢您的慷慨建议!
答案 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
的单独元素上没有任何意义-顺序是元素之间的关系 ,而不是每个孤立元素的属性。