在Scala中设计一个通用特征

问题描述 投票:1回答:1

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

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

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

scala generics traits
1个回答
3
投票

约束[A: Ordering]没有说明类型A本身。相反,它指定存在类型为Ordering[A]的(implicitl)实例。保证Ordering[A]类型实例存在的最简单方法是简单地提供方法def ord: Ordering[A]

因此,您可以将排序转换为trait的成员,然后接受作为factory-method参数的排序:

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上运行的模块时才有意义。附加Ordering来分离A的元素没有任何意义 - 排序是元素之间的关系,而不是每个单独的元素的属性。

© www.soinside.com 2019 - 2024. All rights reserved.