如何解决在Scala枚举中具有关联的类型
我创建了(我认为)具有关联类型的枚举,但要限制该关联类型必须是数字特征的实现:
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]]
我仍然遇到问题,在这种情况下,我要重复自己,无论如何,枚举的优势几乎都消失了。
有人可以引导我走上正确的路吗?
谢谢!
解决方法
只需从DataType
中删除类型参数即可。
sealed trait DataType {
type NumT <: Numeric[NumT]
}
trait Positions extends DataType {
type NumT = Double
}
但是请注意,由于原始代码无法编译的原因,该代码无法编译:{{1}}不是Double
的子类型。
尽管如此,您可以使用Numeric[Double]
的不同定义:
DataType
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。