2012-02-19 50 views
0

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

回答

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

編譯沒有錯誤。

+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

相關問題