Scala:定义类型的构造函数中是否存在协方差?

时间:2012-02-19 00:53:48

标签: generics scala covariance

我有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

的所有实例化中添加第二个类型参数,我会更喜欢它

1 个答案:

答案 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())
}

编译没有错误。