2012-02-19 14 views
0

私はMaxScala:定義された型のコンストラクタに共分散がありますか?

case class Max(seq: Int = 0, value: Float = .0f) extends SeqVal[Float] with Calc[SeqVal[Float]]であり、そしてMax以外の場合クラスがあるnew Variable[SeqVal[Float]](Max())でインスタンス化class Variable[X <: SeqVal[_]](initialState:Calc[X])

を有します。

Maxが特性Calc[SeqVal[_]]の変形を実装していても、これはコンパイルされません。

[error] ../Variable.scala:14: type mismatch; 
[error] found : com.quasiquant.calc.Max 
[error] required: com.quasiquant.calc.Calc[com.quasiquant.calc.Price] 
[error] Note: com.quasiquant.messages.SeqVal[Float] >: com.quasiquant.calc.Price (and com.quasiquant.calc.Max <: com.quasiquant.calc.Calc[com.quasiquant.messages.SeqVal[Float]]), but trait Calc is invariant in type X. 
[error] You may wish to define X as -X instead. (SLS 4.5) 
[error] extends Variable[Price](Max(), initChildren) 

私はinitialStateCalc[X](だけでなく、Max)を実装して何にでも設定することができますので、initialState:Calc[X]の境界を変更することができますどのように動作するように試みることに助けが必要。

trait SeqVal[T] 
trait Calc[T] 

class Variable[X <: SeqVal[_]](initialState: Calc[X]) 

case class Max(seq: Int = 0, value: Float = .0f) 
    extends SeqVal[Float] with Calc[SeqVal[Float]] 

object test { 
    new Variable[SeqVal[Float]](Max()) 
} 

がエラーなしでコンパイル:私はVariable

+0

あなたのコードは私にとってうまくコンパイルされます(Scala 2.9.1)。 – Owen

+0

もっと伝統的なフレーズは 'class Variable [X](initialState:Calc [SeqVal [X]])'であることに注意してください。意味の違いがあるかどうかはわかりません。 (どちらもコンパイル)。 – Owen

+0

あなたはこの質問の目的のためにスニペットだけを含んでいるので、コンパイルするコードを投稿することができます。私は、コンパイラのエラーを引き起こしている何かを逃したと思う。 – George

答えて

3

のすべてのインスタンスに2つ目のタイプのパラメータを追加する必要はありませんでした場合、私はここで私がコンパイルしようとしたコードがありますそれを好むだろう。

+0

私はこの間違いを覚えました。このケースクラスPrice(seq:Int = 0、value:Float = .0f)をCalc [SeqVal [Float]] { def recalc(入力:私は '新しい変数[価格](Max())'で使っていたが、詳細を減らすために投稿する前に削除した。問題を解決しました。新しい変数[SeqVal [Float]](Max())を使用して問題を解決しました。 – George

+0

あなたは私の質問に答えました。ありがとうございます。 – George

+0

うれしいことに助けてくれました。 – Owen

関連する問題