2012-02-09 46 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