class C [+T] { var v : T = _ }

编译器错误:协变类型T出现在值value_ =的类型T中的逆变位置

为什么? 我该怎么解决?

===============>>#1 票数:18 已采纳

你不能有一个协变类型的var。 def v_=(newV: T)公共def v_=(newV: T) ,因此它使T显示为常规参数,这是一个逆变位置。 所以你必须要么

  • 放弃协方差并声明C [T]而不是C [+ T]
  • 使va val

为了使你的问题的“为什么”部分更加冗长,通过使T是带有+ T的协变参数,如果B是A的子类型,则表明你希望C [B]为C [A]的子类型这意味着你想要允许:

val cb: C[B] = new C[B]
val ca : C[A] = cb    

为了发出这种声音,编译器限制了T可能出现在C中的位置。为了简化并简化了一些简化,v不能作为例程的参数(或var的类型)出现。 否则,在你如上所述初始化cb和ca后,你就可以了

ca.v = new A

这是允许的,因为ca应该是C[A] ,所以它的变量vA型。 然而,由于C在T中是协变的,因此ca可以(并且在该示例中)参考C[B]实例。 如果允许这项任务,你可以这样做

val vInCb: B = cb.v

相信这会给你一个B. 但是,你只需通过ca引用放一个A. 必须禁止这种情况,并且禁止协变类型参数T作为var的类型。

===============>>#2 票数:11

你可以将它声明为private[this]

class C [+T] { private[this] var v : T = _ }

您尝试此范围不允许的任何使用对于共变体T都是不安全的。

===============>>#3 票数:2

你必须使它成为一个val var总是有一个setter方法,其中类型出现在逆变位置。

  ask by rastafarra translate from so

未解决问题?本站智能推荐:

2回复

Scala协变量doc示例允许苹果和橙子

遵循上限示例http://docs.scala-lang.org/tutorials/tour/upper-type-bounds.html看到此实现 但是此定义似乎允许在同一容器中进行多个不相关的事物 因此,我不确定这是否是文档中的一个很好的例子。 而且,问题是,我如何修改约
1回复

没有协变量注释的高级同类

当试图在Scala中使用更高种类的存在时,我遇到了以下问题: 如编译器建议的那样,向H添加协变注释。 如果我不希望H是协变的,有没有办法解决这个问题?
3回复

使用协变类型在Scala参数化类中实现方法

我已经阅读了一些教程,包括关于协变类型的方法签名的主要Scala文档。 假设我有以下抽象类: 我的问题涉及add()方法的签名。 为什么有必要这样声明? 我们传入的参数是A的超类型。这解决了什么问题? 我试图在直观的层面上理解这一点。
2回复

协变量FParam出现在值猜测的Seq [FParam]类型的反位置

考虑以下简单示例: 它不会编译,因为 协变类型FParam出现在值猜测的Seq[FParam]类型的反位置。 但是seq被定义为trait Seq[+A] ,那么这种矛盾的根源是什么? ( 问题1 ) 相反,请考虑使用-FParam简单示例: 协变类
1回复

带有上限的Scala协变量类型声明,为什么方法需要重复重复上限

我有一个如下所示的特征: 如果我使用process[D >: T](doc: D)声明process方法,则无法从Document类访问这些方法。 我不知道为什么需要在process方法中重复上限<: Document 。 因此,有两个问题: 这是应该使
1回复

协变类型参数

我最近一直在努力推动我对Scala的理解,我无法弄清楚有关协变/逆变类型参数的一些事情。 假设我有一个名为Basket的课程,如下所示: 和这样的一些类: 我肯定知道这些断言是正确的: Basket[Fruit]可以实例化 Basket[String]无
4回复

为什么数组不变,但列出协变?

例如,为什么呢 工作,但是 失败(因为数组是不变的)。 这个设计决定背后的效果是什么?
1回复

Seq [+ A]如何在A中协变?

如果A出现在逆变位置,Seq [+ A]如何在A中是协变的: 据我所知,方法参数类型是逆变位置。 我错过了什么?
1回复

在协变位置上使用协变类型是否有其他选择?

我正在寻找一种从现有实例创建新实例的模式,这样我就可以通过遍历其上方的层次结构来计算Tile的UltimateBase。 我尝试了以下操作,但是在buildTile方法的参数库中获得了“协变类型A在协变位置出现”的信息 。 是否有替代模式来构建依赖于先前实例的实例? 谢谢。
1回复

在Scala中调用协变方法

我有一堂课 然后我为类创建一个方法来打印数字 所以它适用于 但不适用于 我收到此错误消息 但是克服错误消息是我们使用协方差的原因。