【问题标题】:Design a generic trait in Scala在 Scala 中设计一个通用特征
【发布时间】:2019-08-20 12:11:33
【问题描述】:

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

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】:

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

    【讨论】:

      猜你喜欢
      • 2019-04-19
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 2021-04-21
      • 1970-01-01
      • 2018-01-15
      相关资源
      最近更新 更多