【发布时间】:2020-08-26 09:33:12
【问题描述】:
我已经创建(我认为)一个具有关联类型的枚举,其约束条件是关联类型必须是 Numeric 特征的实现:
sealed trait DataType[T <: Numeric[T]] { type NumT = T }
trait Positions extends DataType[Double]
trait Values extends DataType[Double]
trait Weights extends DataType[Double]
trait Prices extends DataType[Double]
这看起来一切都很好,甚至可能很好,但是我想在案例类中使用这个枚举,而不必复制类型参数 - 所以下面这个非工作示例的精神代码:
case class SingleValue[DataT <: DataType] (
datum: DataT#NumT,
) {
def addToDatum(plus: DataT#NumT): SingleValue[DataT] = (this.datum += plus)
}
这不能编译,我也不能让它工作 - 编译器要求 DataType 上的类型参数,但即使给定一个 - 像
case class SingleValue[T <: Numeric[T], DataT <: DataType[T]]
我仍然遇到问题,在这种情况下,我在重复自己,无论如何,枚举的优势大部分都消失了。
谁能引导我走上正确的道路?
谢谢!
【问题讨论】:
-
这段代码中没有枚举,所以不清楚你的意思。
-
@jwvh 我的理解是,使用带有多个扩展的密封特征是在 Scala 中进行枚举的惯用方式。
-
你得到的是Algebraic Data Type。更具体地说,它是一个总和类型的 ADT。惯用枚举从扩展 Enumeration class 开始。