私はMax
がScala:定義された型のコンストラクタに共分散がありますか?
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)
私はinitialState
がCalc[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
あなたのコードは私にとってうまくコンパイルされます(Scala 2.9.1)。 – Owen
もっと伝統的なフレーズは 'class Variable [X](initialState:Calc [SeqVal [X]])'であることに注意してください。意味の違いがあるかどうかはわかりません。 (どちらもコンパイル)。 – Owen
あなたはこの質問の目的のためにスニペットだけを含んでいるので、コンパイルするコードを投稿することができます。私は、コンパイラのエラーを引き起こしている何かを逃したと思う。 – George