Иерархия классов значений в 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]
Другие вопросы по тегам