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

发布于 2025-01-07 16:17:31 字数 1086 浏览 2 评论 0原文

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

I have the class Variable[X <: SeqVal[_]](initialState:Calc[X])

which I instantiate with new Variable[SeqVal[Float]](Max()) where Max is

case class Max(seq: Int = 0, value: Float = .0f) extends SeqVal[Float] with Calc[SeqVal[Float]], and there are other case classes other than Max.

This does not compile even though Max does implement a variant of the trait 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)

I need help in trying to work out how I can change the bounding of initialState:Calc[X] so the initialState can be set to anything that implements Calc[X] (not just Max). I would prefer it if i didn't have to add a second type parameter to all the instantiations of Variable

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

音盲 2025-01-14 16:17:32

这是我尝试编译的代码:

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

编译没有错误。

Here's the code I tried compiling:

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

Compiles without errors.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文