问题标签 [covariance]

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 投票
13 回答
5904 浏览

java - 任何简单的方法来解释为什么我不能做 List动物 = 新的 ArrayList()?

我知道为什么不应该这样做。但是有没有办法向外行解释为什么这是不可能的。你可以很容易地向外行解释这个:Animal animal = new Dog();。狗是一种动物,但狗的列表不是动物的列表。

0 投票
3 回答
1098 浏览

c# - 逆变和实体框架 4.0:如何将 EntityCollection 指定为 IEnumerable?

我已经指定了几个接口,我正在使用 Entity Framework 4 将它们实现为实体。我能想到的最简单的演示代码是:

我从上面收到以下编译器错误:

“Demo.ConcreteContainer”没有实现接口成员“Demo.IContainer.Children”。“Demo.ConcreteContainer.Children”无法实现“Demo.IContainer.Children”,因为它没有“System.Collections.Generic.IEnumerable”的匹配返回类型

我目前的理解是,这是因为IEnumerable(由 EntityCollection 实现)是协变的,但可能不是逆变的:

此类型参数是协变的。也就是说,您可以使用您指定的类型或任何派生度更高的类型。有关协变和逆变的更多信息,请参阅泛型中的协变和逆变。

我是否正确,如果是这样,有什么方法可以实现我的目标,即IContainer纯粹根据其他接口而不是使用具体类来指定接口?

或者,我是否误解了更基本的东西?

0 投票
4 回答
537 浏览

c# - 实例化参数化类型列表,更好地利用泛型和 Linq

我正在使用一种或多种哈希算法对文件进行哈希处理。当我尝试参数化我想要的哈希类型时,它比我希望的要混乱得多。

我想我错过了更好地利用泛型或 LINQ 的机会。我也不喜欢我必须使用 Type[] 作为参数,而不是将其限制为更具体的一组类型(HashAlgorithm 后代),我想将类型指定为参数并让此方法执行构造,但如果我让调用者新的 HashAlgorithm 实例传入,这可能看起来会更好?

0 投票
3 回答
9766 浏览

c++ - C++:如何在不强制转换的情况下避免继承类中的“无效协变返回类型”?

我有一个非常复杂的类层次结构,其中类相互依赖:有两个抽象类 A 和 C,其中包含一个分别返回 C 和 A 实例的方法。在他们继承的类中,我想使用协变类型,在这种情况下这是一个问题,因为我不知道一种方法来前向声明继承关系。

我得到一个“test.cpp:22: error: invalid covariant return type for 'virtual D* B::outC()'” - 错误,因为编译器不知道 D 是 C 的子类。

如果我将 B::outC() 的返回类型更改为 C*,则示例编译。有什么方法可以将 B* 和 D* 作为继承类中的返回类型(对我来说有一种方法很直观)?

0 投票
4 回答
581 浏览

generics - 为什么需要 IEnumerable 的函数不接受 IEnumerable?

比如说,我有一堂课:

然后,我想使用以下代码:

但这会产生错误:

为什么是这样?由于 MyFoo 实现了 IMyBar,人们会期望 MyFoo 的 IEnumerable 可以被视为 IMyBar 的 IEnumerable。一个平凡的现实世界示例正在生成汽车列表,然后被告知这不是车辆列表。

这只是一个小烦恼,但如果有人能对此有所了解,我将不胜感激。

0 投票
3 回答
45363 浏览

java - 给出在 Java 中重载和覆盖的情况下演示协变和逆变的函数示例?

请举一个Java中协变和逆变的好例子。

0 投票
6 回答
975 浏览

c# - 为什么在实现接口的方法时可以应用“协变”和“逆变”的概念?

用例是这样的:

现在我的问题是,如果我们考虑协方差和逆变的基础,为什么不能使用“SomeClass(因为它是从对象派生的)”作为 Clone() 方法的返回类型

有人可以解释一下微软这个实现背后的原因吗????

0 投票
3 回答
5068 浏览

c# - 为什么 C# (4.0) 不允许泛型类类型中的协变和逆变?

这种限制的真正原因是什么?只是必须完成的工作吗?概念上很难吗?这是不可能的吗?

当然,不能在字段中使用类型参数,因为它们始终是可读写的。但这不可能是答案,不是吗?

这个问题的原因是我正在写一篇关于 C# 4 中的方差支持的文章,我觉得我应该解释一下为什么它仅限于委托和接口。只是为了颠倒举证责任。

更新: 埃里克问了一个例子。

这个怎么样(不知道这是否有意义,但是:-))

将它放在一个类中的原因可能是类本身中保存的缓存。并且请不要将您不同类型的宠物命名相同!

顺便说一句,这让我想到了 C# 5.0 中的可选类型参数 :-)

更新 2:我没有声称 CLR 和 C# 应该允许这样做。只是试图了解导致它没有的原因。

0 投票
2 回答
850 浏览

c# - C# 4.0 RC,Silverlight 4.0 RC 协方差

我正在尝试使用 C# 4.0 开发 Silverlight 4 应用程序。我有一个这样的案例:

别处:

以及我遇到问题的用法:

现在我相信这在 C# 3.0 中是不可能的,因为泛型类型是“不变的”。但是我认为这在 C# 4.0 中通过泛型技术的新协变是可能的?

据我了解,在 C# 4.0 中,许多通用接口(如 IEnumerable)已被修改以支持变化。在这种情况下,我的Foo班级是否需要任何特别的东西才能成为协变的?

Silverlight 4 (RC) 是否支持协方差?

0 投票
3 回答
35881 浏览

java - 泛型:列表与列表相同?

我只是想了解extendsJava 泛型中的关键字。

List<? extends Animal>意味着我们可以将任何对象塞入Listwhich IS A Animal

那么以下内容是否也意味着同样的事情:

有人可以帮我知道上述两者之间的区别吗?对我来说extends,这里听起来是多余的。

谢谢!