我需要支持单位数量。我希望类型系统尽可能地强制执行单位正确性。例如,不应该将克与美元组合。我走的是参数化类型的路径,但是这个代码似乎比我从其他人看到的Scala代码重复得多。
abstract class UnitOfMeasure
abstract class Range[T] {
type T <: UnitOfMeasure
}
class Quantity[T <: UnitOfMeasure](value: Double)
class DefiniteRange[T<:UnitOfMeasure](lowerBound: Quantity[T], upperBound: Quantity[T]) extends Range[T]
class Confidence(conf: Double) {
require(0.0 <= conf && conf <= 1.0)
}
class ConfidenceInterval[T<:UnitOfMeasure](lowerBound: Quantity[T], upperBound: Quantity[T], confidence: Confidence) extends Range[T] {
def this(lower: Quantity[T], upper: Quantity[T]) = this(lower, upper, new Confidence(.90))
}
有更清洁的方法吗? “T&lt;:UnitOfMeasure”的鼓声是困扰我的主要因素。
答案 0 :(得分:4)
答案 1 :(得分:1)
我没有这本书,但也许你需要self type。您可以将类包含在另一个类中,并添加要在类范围中使用的类型定义。
答案 2 :(得分:1)
来自mdmcnlly:
我记得在中看到一个例子 Scala中的编程书那个dealth 有一种基本类型的动物有一个 兼容的食物和亚型 只能吃他们兼容的 亚型而不是其他食物。一世 感觉它是相关的,但我不是 当然。也许有人拿着这本书 方便可以梳理出好的掘金。 解决方案的要点是使用 相反,键入基类的成员 这些方差注释全都是 这个地方。