Иерархия классов значений в Scala?
Я определил следующую иерархию классов, где я хочу ограничить параметр типа для соответствия Double
...
sealed abstract class Quantity[-T](value: T)(implicit ev: T <:< Double)
case class DiscreteQuantity(value: Long) extends Quantity[Long](value)
case class ContinuousQuantity(value: Double) extends Quantity[Double](value)
... возможно ли переписать вышеприведенную иерархию так, чтобы конкретные типы были классами значений? Из документов я знаю, что классы значений не могут быть расширены, так что исключает возможность Quantity
наследовать от AnyVal
, Для того, чтобы конкретные классы унаследовали от AnyVal
Мне нужно сделать Quantity
черта, которая хороша, но тогда я теряю противоположную аннотацию на параметре типа.
Мысли?
1 ответ
Решение
Это возможно, но, как я уже сказал в комментарии: <:<
а также <:
не включать слабое соответствие, поэтому в основном только Quantity[Double]
может существовать.
sealed trait Quantity[-T <: Double] extends Any {
protected[this] def value: T
}
case class ContinuousQuantity(value: Double) extends AnyVal with Quantity[Double]