【问题标题】:Scala : Can there be covariance in a constructor for defined type?Scala:定义类型的构造函数中是否存在协变?
【发布时间】:2012-03-09 21:07:49
【问题描述】:

我有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之外还有其他case类。

即使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 的所有实例添加第二个类型参数,我会更喜欢它

【问题讨论】:

  • 你的代码对我来说编译得很好(Scala 2.9.1)。
  • 另请注意,更传统的措辞是class Variable[X](initialState: Calc[SeqVal[X]])。我不确定是否存在语义差异。 (都编译)。
  • 你能发布你编译的代码吗,因为我只包含了这个问题的sn-ps。我怀疑我错过了导致编译器错误的东西。

标签: generics scala covariance


【解决方案1】:

这是我尝试编译的代码:

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

编译没有错误。

【讨论】:

  • 所以我犯的错误是我忘记包含我在new Variable[Price](Max()) 中使用的case class Price(seq: Int = 0, value: Float = .0f) extends SeqVal[Float] with Calc[SeqVal[Float]] { def recalc(input: SeqVal[Float]) = new Price(input.seq, input.value) },但我在发布之前删除了它以减少细节。原来是问题所在 - 使用 new Variable[SeqVal[Float]](Max()) 解决了问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 2020-10-18
相关资源
最近更新 更多