scala - 在 Scala 中设计一个通用特征
问题描述
我最近在学习数据结构。有一种情况,我想设计一个应该支持可比较类型的通用特征。如果我需要设计一个泛型类,我可以设计如下:
class SortedType [A: Ordering](val x: A)
val x = new SortedType(3)
val y = new SortedType("Hello, World!")
但是,由于在 scala 中,特征不能有带有上下文边界的参数,所以我不能定义这样的特征trait SortedType[A: Ordering]
。如何设计特征以使其具有可比性的泛型类型支持?感谢您的慷慨建议!
解决方案
约束[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
s上运行时才有意义。将 an 附加Ordering
到单独的元素A
没有任何意义 - 排序是元素之间的关系,而不是每个单独元素的属性。
推荐阅读
- css - 字体真棒库不能与 Angular 项目中的 Angular 材料库一起使用
- postgresql - 为什么 `pg_config --version` 给出的版本与 `select version();` 不同?
- python - 如何按日期列按 2016-05-06 格式的升序对数据框进行排序?
- algorithm - 学习数据结构的策略(尤其是代码部分)
- android - 谷歌地图没有从数据库中提取我的标记
- python - 如何使用 Python 将 JSON 文件转储到 mongodb
- c# - 自动递增抽象基类的 typeid
- c - 基于 C 中的 char* 的多平台 Unicode 处理而不使用 3rd 方库?
- c - 出现错误:表达式必须具有指向对象的类型
- c++ - 是否可以制作 32 位 gRPC 和 protobuf?