Scala:在定义类型的构造函数中是否可以存在协变?

Scala:在定义类型的构造函数中是否可以存在协变?

问题描述:

我有class Variable[X <: SeqVal[_]](initialState:Calc[X])Scala:在定义类型的构造函数中是否可以存在协变?

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

你的代码对我来说编译得很好(Scala 2.9.1)。 – Owen 2012-02-19 01:00:52

+0

还要注意,更传统的措辞是'class Variable [X](initialState:Calc [SeqVal [X]])''。我不确定是否存在语义差异。 (都编译)。 – Owen 2012-02-19 01:05:05

+0

你可以发布你的编译代码,因为我只包含了这个问题的片段。我怀疑我错过了一些导致编译器错误的东西。 – George 2012-02-19 01:11:04

所有的实例下面是我试图编译代码:

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

编译没有错误。

+0

所以我犯的错误是我忘了包括这个case class价格(seq:Int = 0,value:Float = .0f)用Calc计算SeqVal [Float] [SeqVal [Float]] def recalc(input: SeqVal [Float])=新价格(input.seq,input.value) }'我在'新的Variable [Price](Max())'中使用'但我在发布之前删除它以减少细节。事实证明,这是问题 - 并使用新的变量[SeqVal [Float]](Max())'修复了问题 – George 2012-02-19 01:43:52

+0

所以你回答了我的问题 - 谢谢 – George 2012-02-19 01:47:30

+0

很高兴我能提供帮助。 – Owen 2012-02-19 01:56:05