问题标签 [covariant]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
104 浏览

c++ - c++继承和容器协变

我正在尝试构建以下架构:

我想以一种不仅可以为 ContainerA 类型而且还可以为 ContainerB 调用函数的方式重新组织以下代码。

如果能够将模拟函数作为 ContainerA 的成员移动,但也可以从 ContainerB 访问(即 ContainerA ca; ca.sum()),那也很好。就这样。我怎样才能重新设计我的架构以允许这样的调用?

0 投票
1 回答
131 浏览

java - 协变数据类型:为什么返回类型必须与其“父方法”返回类型相同或子类型?

由于这不是那么著名的概念,我将做一点介绍。

方法的协变返回类型是在子类中重写该方法时可以用“更窄”类型替换的方法。

所以我可以很好地编译这个小程序(因为 String 是 Object 的子级):

规则很容易记住,但我不明白。我的问题是这样的:

为什么DogHouse中someMethod中的返回类型只能与类House中someMethod中的返回类型相同或子类型?我希望这个问题很清楚。

或者..(例如)如果我将返回类型放在类House中的someMethod中,为什么这段代码不会编译?(字符串不是整数的孩子) Integer

“幕后”发生了什么,所以我可以理解它?

0 投票
0 回答
54 浏览

c# - 协变类型不用作接口方法的通用约束,为什么?(C#)

问题:

为什么在这种情况下不允许对方法的通用约束。

编辑:大声笑我找到了答案,方法中的通用类型“T”实际上是一个参数(或输入),因此它不是协变的。

0 投票
1 回答
91 浏览

scala - 铸造问题

这给出了以下错误:

scala> TP(Sym[M1]{4},new N1()) java.lang.ClassCastException: class N1 cannot be cast to class scala.Product (N1 is in the unnamed module of loader scala.tools.nsc.interpreter.IMain $TranslatingClassLoader @2098d37d; scala.Product 在 Def.hashCode 的加载程序'bootstrap'的未命名模块中
$lzycompute(:13) at Def.hashCode(:13) at java.base/java.lang.Object.toString(Object .java:246) 在 java.base/java.lang.String.valueOf(String.java:2951) 在 java.base/java.lang.StringBuilder.append(StringBuilder.java:168) 在 scala.collection.IterableOnceOps。 addString(IterableOnce.scala:1194)
at scala.collection.IterableOnceOps.addString$(IterableOnce.scala:1186)
at scala.collection.AbstractIterator.addString(Iterator.scala:1279)
在 scala.collection.IterableOnceOps.mkString(IterableOnce.scala:1136) 在 scala.collection.IterableOnceOps.mkString$(IterableOnce.scala:1134) 在 scala.collection.AbstractIterator.mkString(Iterator.scala:1279)
在 scala.runtime .ScalaRunTime$._toString(ScalaRunTime.scala:159) at TP.toString(:18) at scala.runtime.ScalaRunTime$.inner$1(ScalaRunTime.scala:261) at scala.runtime.ScalaRunTime$.stringOf(ScalaRunTime.scala :266) 在 scala.runtime.ScalaRunTime$.replStringOf(ScalaRunTime.scala:27​​4) 在 .lzycompute(:8) ... 28 省略

我期待一个 TP[Trial] 类型的对象,发生了什么?因为 Sym 和 Def 是协变类型。我错过了什么吗?

谢谢

0 投票
3 回答
430 浏览

scala - Scala中的协变和逆变

我在理解协方差类型受方法参数限制时感到困惑。我通读了许多材料,但无法将它们理解为以下概念。

在上面这段代码中,a 的类型是 T。为什么我们不能传递 T 的子类型?方法对参数 x 的所有期望,都可以通过 T 的子类型完美地满足。

同样,当我们有逆变类型 T (-T) 时,它不能作为方法参数传递;但这是允许的。为什么我认为它不能被传递是:例如,说方法调用 T 中存在的 a 上的方法(存在于对象 a 中)当我们传递 T 的超类型时,它可能不存在。但它是编译器允许的。这让我很困惑。

因此,通过查看上述内容,在方法参数和返回类型中应该允许协变。不能应用逆变。

有人可以帮我理解。

0 投票
2 回答
57 浏览

scala - Scala中的逆变用法

根据逆变的定义(将接受超类实例),我在下面的代码片段中的最后一条语句应该被接受;但它会抛出类型错误。请您纠正我的理解。

不过 x.set(new C)还好!因此,即使“逆变参数被接受为方法参数”实际上也是协变参数。

0 投票
1 回答
42 浏览

android - 在泛型类型中使用 out 关键字而不会出现编译错误的规则是什么

在 Kotlin 中,我正在学习协变(可以使用子类型代替超类型)。他们在那里写了一些类似规则的东西。但这对我来说似乎是错误的。这个已经写完了:

但是,如果类具有该泛型类型的函数参数或 var 属性,则不能使用 out。

但我认为or应该替换为and,因为在类具有“获取”类型作为参数的函数的情况下,如果泛型类型的属性是val而不是var,并且损坏无法完成,因为 val 属性无法进行任何分配。我是对的还是书中写的内容是正确的,我遗漏了什么?

编辑:我刚刚意识到(根据我在这个论坛上看到的一些帖子),尽管属性被声明为 val,但参数可能成为问题的唯一情况是,如果我们有一个 T 类型的容器,那么就说 List如果我们尝试添加到List可能会出现问题,但是如果我们没有容器,我在获取参数类型时看不到情况,而属性为 val 时可能会出现问题。我对吗?

0 投票
0 回答
20 浏览

model - 重复测量 ANCOVA

我想运行重复测量 ANCOVA,但不知道如何正确编程...

我的重复测量模型如下: model <- aov(value ~ (Condition) + Error(pp_no/Condition), data = data_SCR_resh)

如何添加我的连续协变量(lum_diff)?...

一切都会有帮助的,娜塔莉

0 投票
2 回答
46 浏览

c# - 通用 IList 方法使用什么类型

我试图编写一种方法,将任何 IList 的事物转换为这些事物的逗号分隔列表作为字符串。它看起来像这样:

我想在可观察的站点集合上使用此方法:

但是,当我尝试运行以下代码时,出现转换错误:

我明白为什么会出现转换错误 - 代码无法知道如何Siteobject. 但是,鉴于ToString()一切都存在,有没有办法可以改变方法ToStringList(),使其可以接受任何类型的 IList?

我已经阅读了一些关于 IList 的文章和页面(比如thisthis),但老实说,他们既困惑又开明——因为我所问的问题是不可能的或冗长以至于不切实际(在这种情况下,我可以找到另一个方法)?

我正在使用 .NET Framework 4.8。