问题标签 [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 投票
2 回答
212 浏览

java - Java 协变返回

在java中,当非协变返回类型产生编译时错误时,为什么协变返回类型是可接受的。当然,如果 JVM 可以处理协变返回类型,那么它就可以处理非协变返回类型。我假设当java看到一个带有协变返回的重写方法时,它只是应用与调用对象关联的方法。为什么非协变返回类型不能发生同样的情况。我的猜测是,这与打破超类方法合同的条款有关,当然,如果允许这样做,那么子类(覆盖)方法的行为就不是很可预测(因为返回类型没有一致性) ?

这是一个示例(假设 DogFood 是 Food 的子类,但 CatFood 不是 Food 的子类):

动物类

狗类

猫类

0 投票
1 回答
112 浏览

scala - 如何在scala中解释::

我写了以下代码:

::方法的实现如下所示:

我预计返回类型是List[Bird]. 为什么呢List[Animal]

0 投票
3 回答
5242 浏览

r - 如何获得调整后的因变量

给定以下数据集:

我想知道组间的 CSF 是否不同。但我知道 CSF 受年龄、性别和 tiv 的影响很大。因此,我想绘制超出年龄、性别和 tiv 影响的群体之间的差异。为此,我需要为这三个协变量调整 CSF。我的问题是:我怎样才能为每个人获得他/她调整后的 CSF 值?

我做了以下线性模型:

并使用 (residuals+intercept) 的和以获得不受年龄、性别和 tiv 影响的 csf 值:

但是,鉴于 CSF 不可能为负,我得到了许多没有意义的负值。所以我的问题是:如何获得针对所有三个协变量调整的良好 CSF 值?

0 投票
1 回答
689 浏览

scala - 为什么泛型类型不能与 Scala 中的继承一起使用?

所以这里是代码:

除了我得到所有案例比较的错误:

构造函数无法实例化为预期类型;找到:week4.expr.Number[T(in class Number)] 要求:week4.expr.Expr[T(in class Expr)] 注意:Nothing <: T (and week4.expr.Number[T] <: week4. expr.Expr[Nothing]),但 Expr 类在类型 T 中是不变的。您可能希望将 T 定义为 +T。

我究竟做错了什么?

0 投票
1 回答
70 浏览

scala - 用理解和协方差解释错误

问题

希望获得帮助以了解错误原因。原件来自Coursera Scala Design Functional Random Generators

任务

使用随机 int 和随机布尔值的工厂,尝试实现随机树工厂。

问题

第一个块中的实现会导致错误,但如果它更改为第二个块,则不会。我相信Factory[+T]这意味着Factory[Inner]并且Factory[Leaf]可以被视为Factory[Tree].

我不知道为什么 for 块中的 if 表达式可以,但在 yield 块中却不行。我很欣赏解释。

但是,下面的作品。

0 投票
1 回答
859 浏览

objective-c - Objective-C 泛型协变

希亚斯

我有这个界面:

现在,当我使用这种实现方法时:

我理所当然地得到一个关于在实现 iterateWithWorkerBlock:withCompletionBlock 时参数类型冲突的编译器警告:

问题是......你到底应该怎么写这个实现方法?我尝试了各种不同的实现,将类型移出 typedef 失败,因为该类型在接口范围之外不可见,在实现中使用 T 作为类型失败,因为显然,实现知道它自己的接口类型,使用就像是

惨遭失败,我真的不知道如何正确实施此方法。现在,我只是使用 id,它给了我这个警告,但我想摆脱这个警告......

布勒?任何人?谢谢

0 投票
1 回答
649 浏览

java - 爪哇。方法覆盖和缩小返回类型

好的,所以我是 Java 新手,所以这可能是一个愚蠢的问题。在我的超类中,有一个方法接受一个通用对象并返回一个对象。在我的子类中,我试图覆盖/缩小方法以返回我在别处定义的抽象类。本质上,此覆盖所需要做的就是执行相同的方法,但将 Object 替换为更窄的类。我该怎么做呢?它应该只是一两行代码,但我只是不知道它的语法。

所以在 SuperClass Foo 中有一个类似的方法:

然后是 diff java 文件中对象的构造函数:

然后在一个子类中:

0 投票
1 回答
133 浏览

c++ - C++ 容器、协方差和模板

我有一些问题需要找到相关的解决方案来解决我的问题。我必须从一个类中返回一些数据,而数据的类型取决于类。我的第一个解决方案是:

但我知道这是不可能的,即使 DerivedData 扩展了 Data,因为无效的协变返回类型。

所以我想出了另一个暗示模板的想法。我所做的是将 Base 类转换为模板类:

然后我可以写一个Derived这样的构造函数:

但知道我还有另一个问题。假设我编写了另一个类,该类有一个方法,该方法采用任何 Base 类的参数。

这不会编译并说

在没有参数列表的情况下无效使用模板名称“Base”

我完全理解。

假设我的代码看起来像这样:

我的解决方案是什么?我可以做类似“模板化”方法 doSomething 的事情吗?

使用类似的原型

那可能吗 ?这是一种好的思维方式吗?来自Java,我曾经通过使用通配符来解决这些问题

但是我听说在 C++ 中严格来说没有这样的东西(或多或少可以用 类似的东西来模拟 std::is_base_of)。

感谢您的时间。

0 投票
1 回答
269 浏览

c++ - C++ 容器如何与 Liskov 替换原则一起工作?

对于返回类型,里氏替换原则要求返回值的协方差

让我们假设返回类型的小类型层次结构:

那时的工人阶级可以

这将符合LSP,因为返回类型是协变的( and的层次结构是BaseandDerived的“co” )。BD

如果容器确实发挥作用怎么办?

这仍然符合 LSP 吗?与vector<B>和是vector<D>“协变的”吗?BaseDerived

vector<B*>附加问题:如果我使用指针作为容器类型(允许动态多态性),即等,它对 LSP 有影响吗?

注意:我尽量不依赖真正的 C++ 覆盖规则,但主要是想了解 LSP。我没有override故意使用关键字。首先我想了解 LSP,然后我可以尝试 C++ 是否支持这些规则。

0 投票
1 回答
89 浏览

c# - c# .net 4.0 协变 vs 逆变

使用逆变器时,我正在尝试使以下内容正常工作和挣扎。我的理解是协方差是您可以从基类型返回派生类型的地方。逆变是您可以将派生类型从基类型作为参数传递给类的地方。

所以我有以下接口(逆变):

然后我有一个抽象类

和另一个具体的类

考虑到泛型类型仅用作输入而不是返回类型,我不明白为什么我不能执行以下操作:

我有另一个使用协方差的例子,它在下面并且工作正常。

抽象的

具体的

现在我可以做

上面的示例还有更多代码,但为了便于阅读,我已将其删除(希望如此!):-)