首页 > 解决方案 > 在 Scala 中设计一个通用特征

问题描述

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

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

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

标签: scalagenericstraits

解决方案


约束[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请注意,这只有在某种模块应该在一大堆As上运行时才有意义。将 an 附加Ordering到单独的元素A没有任何意义 - 排序是元素之间的关系而不是每个单独元素的属性。


推荐阅读