问题标签 [contravariance]

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 投票
3 回答
3161 浏览

c++ - 如何在 C++ 中实现模板类协方差?

是否有可能以这样一种方式实现一个类模板,如果它们的模板参数相关,一个对象可以转换为另一个对象?这是一个展示这个想法的例子(当然它不会编译):

这里的另一个问题是 Foo 是一个抽象类,用作包含返回 T& 和 T* 的函数的接口,因此我无法实现模板复制构造函数。

我正在编写一个通用的 Iterator 类,它可以容纳任何 STL 迭代器,除了类型擦除之外,我还希望它是多态的,即我可以写这样的东西:

UPD:那是我的错误,我实际上不需要将 Foo* 转换为 Foo* 来实现 MyIterator,所以我认为这个问题不再实际。

0 投票
3 回答
4269 浏览

c# - 演员表- 协方差/逆变问题

给定以下类型:

我想知道如何将 a 转换List<MyClass>为 a List<IMyClass>?我对协变/逆变主题并不完全清楚,但我知道我不能因此而简单地投射列表。

我只能想出这个微不足道的解决方案;缺乏任何优雅,浪费资源:

您如何以更优雅/高性能的方式解决它?

请注意,我需要 .NET 2.0 解决方案,但为了完整起见,我也很乐意看到使用更新框架版本的更优雅的解决方案。

0 投票
3 回答
13449 浏览

c# - T 必须是逆变有效的

这有什么问题?

它说:

无效方差:类型参数“T”必须在“MyNamespace.IRepository.Delete(T)”上逆变有效。“T”是协变的。

0 投票
1 回答
1096 浏览

c# - 实现 Co 和 Contra 方差通用接口及其实际用途

我试图了解使用变体通用接口的可能用途(同时使用 co 和 contra 变体)。有人可以解释一下吗?我分别理解了接口的 co 和 contra 方差示例,

协方差示例

反方差示例

Co/Contra方差

谢谢

0 投票
4 回答
499 浏览

scala - 逆变和val

“val”和“case”如何以及为什么会影响类型系统?(尤其是方差)

0 投票
1 回答
93 浏览

.net - 有机会合法投吗?

这是我第一次在这里发布问题,所以提前感谢任何人会帮助我(也许还有其他人)。

今天我一直对 C# 4 中的协变和逆变感到困惑,但我真的看不出有任何可能做我想做的事。注意:所有这些都不是为了解决特定问题,但我想知道是否有任何合法的方法(C# 4 中全新的 co/contra-variance)来解决它。所以,不要发疯...

这里是示例代码:

该集合应该能够托管任何 IBase 衍生品,它们是任何 T 的。当然,我可以使用非泛型集合或列表,游戏就结束了。另一个想法是有一个更通用的接口 IBaseCore,然后 IBase 继承自。我的问题是:如果没有这些技巧,我可以收集 IBase 并添加任何 IBase 的项目吗?

谢谢大家。

0 投票
2 回答
178 浏览

.net - 从语言上讲,与代表相关的逆变如何有意义?

来自维基百科

协变:从更宽(双)转换为更窄(浮动)。
逆变:从更窄(浮动)转换为更宽(双)。

在 .NET 中,委托具有协变,因为它允许委托的指定返回类型的派生类型成为它持有引用的方法的返回类型。

委托也具有逆变性,因为它允许委托的指定参数(参数)的派生类型作为传递给它所引用的方法的参数类型。

有了这两个与代表有关的定义,它们不应该都是协变的吗?在这两种情况下,委托都期望“更宽”的类型,但被赋予“更窄的类型”。

请参阅此处以获取来自 MSDN 的两者的示例。

那么,当与代表有关时,逆变这个词在语言上是如何有意义的呢?

0 投票
1 回答
3431 浏览

scala - 错误:协变类型 A 出现在逆变位置

我试图写一个不可变的Matrix[A]类。我希望类是协变的,A但是当我放在编译器+前面时,A开始抱怨类中的一些操作。

以下是我Matrix班级的一个相关子集(实际班级比以下子集大 5 倍):

对于类中的最后四个操作,编译器显示错误“协变类型 A 出现在逆变位置”。我无法理解这些错误的原因,以及如何摆脱它。请解释这些错误背后的原因并提出解决方法。谢谢。

0 投票
2 回答
2245 浏览

scala - 在设计业务应用程序时如何使用协变和逆变?

我知道在标准库中使用co-contravariance(例如集合和特征Function)我想知道如何co-以及contravariance在“现实世界”业务应用程序的设计中使用。

0 投票
1 回答
609 浏览

scala - 如何确定类型参数的方差?

受到Scala中协变和逆变的真实示例的启发,我认为一个更好的问题是:

在设计库时,在确定类型参数应该是协变还是逆变时,是否应该问自己一组特定的问题?还是应该让所有内容保持不变,然后根据需要进行更改?