2016-12-04 116 views
1

我已经定义了下面的类层次结构,我要限制的类型参数是舒适与Double ...Scala中的值类的层次结构?

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成为一个特性,这很好,但是随后我在类型参数上丢失了反变量注释。

想法?

+0

您从开始的代码不起作用:“无法证明Long <:

回答

4

这是可能的,但正如我在评论说:<:<<:不包括弱一致性,所以基本上只能Quantity[Double]可以存在。

sealed trait Quantity[-T <: Double] extends Any { 
    protected[this] def value: T 
} 

case class ContinuousQuantity(value: Double) extends AnyVal with Quantity[Double]