Scala: может ли быть ковариация в конструкторе для определенного типа? - PullRequest
0 голосов
/ 19 февраля 2012

У меня есть 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 Ответ

3 голосов
/ 19 февраля 2012

Вот код, который я пытался скомпилировать:

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

Компилируется без ошибок.

...