问题标签 [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.
java - Java 协变返回
在java中,当非协变返回类型产生编译时错误时,为什么协变返回类型是可接受的。当然,如果 JVM 可以处理协变返回类型,那么它就可以处理非协变返回类型。我假设当java看到一个带有协变返回的重写方法时,它只是应用与调用对象关联的方法。为什么非协变返回类型不能发生同样的情况。我的猜测是,这与打破超类方法合同的条款有关,当然,如果允许这样做,那么子类(覆盖)方法的行为就不是很可预测(因为返回类型没有一致性) ?
这是一个示例(假设 DogFood 是 Food 的子类,但 CatFood 不是 Food 的子类):
动物类
狗类
猫类
scala - 如何在scala中解释::
我写了以下代码:
该::
方法的实现如下所示:
我预计返回类型是List[Bird]
. 为什么呢List[Animal]
?
r - 如何获得调整后的因变量
给定以下数据集:
我想知道组间的 CSF 是否不同。但我知道 CSF 受年龄、性别和 tiv 的影响很大。因此,我想绘制超出年龄、性别和 tiv 影响的群体之间的差异。为此,我需要为这三个协变量调整 CSF。我的问题是:我怎样才能为每个人获得他/她调整后的 CSF 值?
我做了以下线性模型:
并使用 (residuals+intercept) 的和以获得不受年龄、性别和 tiv 影响的 csf 值:
但是,鉴于 CSF 不可能为负,我得到了许多没有意义的负值。所以我的问题是:如何获得针对所有三个协变量调整的良好 CSF 值?
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。
我究竟做错了什么?
scala - 用理解和协方差解释错误
问题
希望获得帮助以了解错误原因。原件来自Coursera Scala Design Functional Random Generators。
任务
使用随机 int 和随机布尔值的工厂,尝试实现随机树工厂。
问题
第一个块中的实现会导致错误,但如果它更改为第二个块,则不会。我相信Factory[+T]
这意味着Factory[Inner]
并且Factory[Leaf]
可以被视为Factory[Tree]
.
我不知道为什么 for 块中的 if 表达式可以,但在 yield 块中却不行。我很欣赏解释。
但是,下面的作品。
objective-c - Objective-C 泛型协变
希亚斯
我有这个界面:
现在,当我使用这种实现方法时:
我理所当然地得到一个关于在实现 iterateWithWorkerBlock:withCompletionBlock 时参数类型冲突的编译器警告:
问题是......你到底应该怎么写这个实现方法?我尝试了各种不同的实现,将类型移出 typedef 失败,因为该类型在接口范围之外不可见,在实现中使用 T 作为类型失败,因为显然,实现知道它自己的接口类型,使用就像是
惨遭失败,我真的不知道如何正确实施此方法。现在,我只是使用 id,它给了我这个警告,但我想摆脱这个警告......
布勒?任何人?谢谢
java - 爪哇。方法覆盖和缩小返回类型
好的,所以我是 Java 新手,所以这可能是一个愚蠢的问题。在我的超类中,有一个方法接受一个通用对象并返回一个对象。在我的子类中,我试图覆盖/缩小方法以返回我在别处定义的抽象类。本质上,此覆盖所需要做的就是执行相同的方法,但将 Object 替换为更窄的类。我该怎么做呢?它应该只是一两行代码,但我只是不知道它的语法。
所以在 SuperClass Foo 中有一个类似的方法:
然后是 diff java 文件中对象的构造函数:
然后在一个子类中:
c++ - C++ 容器、协方差和模板
我有一些问题需要找到相关的解决方案来解决我的问题。我必须从一个类中返回一些数据,而数据的类型取决于类。我的第一个解决方案是:
但我知道这是不可能的,即使 DerivedData 扩展了 Data,因为无效的协变返回类型。
所以我想出了另一个暗示模板的想法。我所做的是将 Base 类转换为模板类:
然后我可以写一个Derived
这样的构造函数:
但知道我还有另一个问题。假设我编写了另一个类,该类有一个方法,该方法采用任何 Base 类的参数。
这不会编译并说
在没有参数列表的情况下无效使用模板名称“Base”
我完全理解。
假设我的代码看起来像这样:
我的解决方案是什么?我可以做类似“模板化”方法 doSomething 的事情吗?
使用类似的原型
那可能吗 ?这是一种好的思维方式吗?来自Java,我曾经通过使用通配符来解决这些问题
但是我听说在 C++ 中严格来说没有这样的东西(或多或少可以用 类似的东西来模拟 std::is_base_of
)。
感谢您的时间。
c++ - C++ 容器如何与 Liskov 替换原则一起工作?
对于返回类型,里氏替换原则要求返回值的协方差。
让我们假设返回类型的小类型层次结构:
那时的工人阶级可以
这将符合LSP,因为返回类型是协变的( and的层次结构是Base
andDerived
的“co” )。B
D
如果容器确实发挥作用怎么办?
这仍然符合 LSP 吗?与vector<B>
和是vector<D>
“协变的”吗?Base
Derived
vector<B*>
附加问题:如果我使用指针作为容器类型(允许动态多态性),即等,它对 LSP 有影响吗?
注意:我尽量不依赖真正的 C++ 覆盖规则,但主要是想了解 LSP。我没有override
故意使用关键字。首先我想了解 LSP,然后我可以尝试 C++ 是否支持这些规则。
c# - c# .net 4.0 协变 vs 逆变
使用逆变器时,我正在尝试使以下内容正常工作和挣扎。我的理解是协方差是您可以从基类型返回派生类型的地方。逆变是您可以将派生类型从基类型作为参数传递给类的地方。
所以我有以下接口(逆变):
然后我有一个抽象类
和另一个具体的类
考虑到泛型类型仅用作输入而不是返回类型,我不明白为什么我不能执行以下操作:
我有另一个使用协方差的例子,它在下面并且工作正常。
抽象的
具体的
现在我可以做
上面的示例还有更多代码,但为了便于阅读,我已将其删除(希望如此!):-)