我有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
你的代碼對我來說編譯得很好(Scala 2.9.1)。 – Owen 2012-02-19 01:00:52
還要注意,更傳統的措辭是'class Variable [X](initialState:Calc [SeqVal [X]])''。我不確定是否存在語義差異。 (都編譯)。 – Owen 2012-02-19 01:05:05
你可以發佈你的編譯代碼,因爲我只包含了這個問題的片段。我懷疑我錯過了一些導致編譯器錯誤的東西。 – George 2012-02-19 01:11:04