我有class Variable[X <: SeqVal[_]](initialState:Calc[X])
我使用new Variable[SeqVal[Float]](Max())
实例化Max
case class Max(seq: Int = 0, value: Float = .0f) extends SeqVal[Float] with Calc[SeqVal[Float]]
,除Max
以外还有其他案例类。
即使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]
的边界,以便initialState
可以设置为实现Calc[X]
的任何内容(而不只是Max
)。如果我不必在Variable
答案 0 :(得分:3)
这是我尝试编译的代码:
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())
}
编译没有错误。