2012-02-09 79 views
0

为什么价格可能找不到SeqValue上的属性值?这似乎很简单,应该工作。斯卡拉上界:值不是类型参数的成员

即时得到错误

[error] .... value value is not a member of type parameter SeqValue 
[error] def recalc[SeqValue](input:SeqValue) = Price(1 + seq, input.value)  

以下代码

sealed trait SeqValue { 
    def seq:Int 
    def value:Float 
    override def toString = ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE) 
} 

sealed trait Calc { 
    type S <: SeqValue 
    def recalc[S](input:S):SeqValue 
} 

case class Price(seq:Int=0, value:Float=.0f) extends SeqValue with Calc { 
    def recalc[SeqValue](input:SeqValue) = Price(1 + seq, input.value) 
} 

的想法是,你可以重计算价格目标上,并通过在任何类型的实现SeqValue的对象,因为SeqValue有一个值。

回答

3

类型成员SCalc正在通过recalc方法的类型参数S被遮蔽。

第二个错误:抽象类型S必须在类Price中定义。

下面应该工作:

sealed trait SeqValue { 
    def seq:Int 
    def value:Float 
    override def toString = ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE) 
} 

sealed trait Calc { 
    type S <: SeqValue 
    def recalc(input:S):SeqValue 
} 

case class Price(seq:Int=0, value:Float=.0f) extends SeqValue with Calc { 
    type S = SeqValue 
    def recalc(input:SeqValue) = Price(1 + seq, input.value) 
} 

编辑:(响应评论)

我不明白你究竟想要做的,但你可以分离出来类型定义在一个单独的mixin特征中。

trait SAsSeqValue { 
    type S = SeqValue 
} 

case class Price(seq:Int=0, value:Float=.0f) extends SeqValue with Calc with SAsSeqValue {  
    def recalc(input:SeqValue) = Price(1 + seq, input.value) 
} 
+0

感谢它的工作!我有很多类实现Calc。有没有一种方法来重新定义类/特征,以便我实际上不必在每个类 – George 2012-02-09 20:31:38

+0

中添加类型'S = SeqValue',它似乎没有工作过'class Price需要抽象,因为方法在特征中被重新计算计算类型[S](输入:S)com.quasiquant.SeqValue未定义 [error] case class价格(seq:Int = 0,value:Float = .0f)用Calc扩展SeqValue' – George 2012-02-09 20:38:01

+0

@George,check编辑。 – missingfaktor 2012-02-09 20:38:13