2012-02-09 21 views
0

価格がSeqValueの属性値を見つけることができないのはなぜですか?それはうまくいくはずです。スカラ上限:値がパラメータ型のメンバではありません

イム次のコード

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) 
} 
のエラー

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

を取得

アイデアは、あなたがあるため、価格のオブジェクトに再計算し、SeqValueを実装するオブジェクトのいずれかのタイプに渡すことができるということですSeqValueには値があります。

答えて

3

タイプメンバーSCalcは、タイプパラメータSrecalcの方法でシャドウされています。

第2の間違い:抽象型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を実装するクラスがたくさんあります。クラス/特性を再定義して、すべてのクラスに 'S = SeqValue'型を追加する必要がないようにする方法がありますか? – George

+0

実際には、class Priceは抽象である必要があります。[エラー]ケースクラス価格(seq:Int = 0、値:Float = .0f)SeqValueをCalcで延長する ' – George

+0

@George、チェック編集。 – missingfaktor

関連する問題