4

我需要支持单位数量。我希望类型系统尽可能地强制执行单元正确性。例如,不可能将克与美元结合起来。我正在走参数化类型的道路,但这段代码似乎比我从其他人那里看到的 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<:UnitOfMeasure”的鼓声是困扰我的主要事情。

4

2 回答 2

1

我没有这本书,但也许你需要一个自我类型。您可以将您的类包含在另一个类中,并添加要在类范围中使用的类型定义。

于 2009-05-07T17:51:38.630 回答
1

来自 mdmcnlly:

我记得在《Scala 编程》一书中看到了一个示例,该示例处理了具有兼容食物的基本类型的动物,以及只能吃与其兼容的子类型而不能为其他人提供食物的子类型。我觉得它是相关的,但我不确定。也许手边有这本书的人可以梳理出好的掘金。解决方案的要点是使用基类的类型成员,而不是到处使用这些差异注释。

于 2009-10-01T18:50:48.190 回答