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

java - 编程语言中的协变和逆变有什么区别?

谁能解释编程语言理论中协变和逆变的概念?

0 投票
7 回答
637 浏览

c# - C# 中的继承 - 简单的问题

复制

在 C# 中,为什么不能将 List 对象存储在 List 变量中

这是我的代码:

SampleDerived 派生自 SampleBase

根据继承逻辑,我应该可以做到这一点。但是,它不能编译 - 错误表明 SampleBase 不能被隐式转换为 SampleDerived 类型。是什么赋予了?

我正在使用 c# 2.0

0 投票
3 回答
726 浏览

c# - c# 2.0(BindingList)中与泛型缺乏协方差的解决方案

这是一个设计问题。我有一个业务对象,以及从它派生的 5 个业务对象类型。

我还将有一个以 BindingList 作为成员的类。我将有 5 个类派生自它。

由于协方差在这里不起作用,您将如何构建设计以最大程度地减少代码重复?我当然可以放弃 BindingList 并使用 DataTable,在这种情况下问题就解决了。

但是由于每个人都对 BindingList 赞不绝口,我很想看看你们会如何处理这个问题。

解决方案(基于 Pavel Minaev 的回答):

0 投票
2 回答
4980 浏览

java - Java协方差

我很难弄清楚这一点。假设我有以下代码:

为什么赋值会导致编译错误?错误类似于:

根据我对协方差的理解,该getMammals()方法返回 alist将始终包含Mammal对象,因此它应该是可分配的。我错过了什么?

0 投票
7 回答
22258 浏览

c# - 我怎样才能转换成 ObservableCollection

How can i cast

from ObservableCollection<TabItem> into ObservableCollection<object>

this doesnt work for me

(ObservableCollection<obje

How can i cast

this doesnt work for me


You can't. ObservableCollection<TabItem> does not derive from ObservableCollection<object>.

If you explain why you would want to perhaps we can point out an alternative interface you can use.

0 投票
3 回答
1988 浏览

c# - 尽管有通用约束,但 C# 类型转换错误

为什么,对“必须继承自 A”的类 P 的类型参数 T 的通用约束,第一次调用成功但第二次调用失败,注释中详述了类型转换错误:

通用约束不应该确保List<T> 确实如此ICollection<A>吗?

0 投票
6 回答
1872 浏览

java - 为什么是列表不是 List 的子类型?
public void wahey(List<Object> list) {}

wahey(new LinkedList<Number>());

The call to the method will not type-check. I can't even cast the parameter as follows:

The call to the method will not type-check. I can't even cast the parameter as follows:

From my research, I have gathered that the reason for not allowing this is type-safety. If we were allowed to do the above, then we could have the following:

Inside the method wahey, we could add some Strings to the input list (as the parameter maintains a List<Object> reference). Now, after the method call, ld refers to a list with a type List<Double>, but the actual list contains some String objects!

This seems different to the normal way Java works without generics. For instance:

What we are doing here is essentially the same thing, except this will pass compile-time checks and only fail at run-time. The version with Lists won't compile.

This leads me to believe this is purely a design decision with regards to the type restrictions on generics. I was hoping to get some comments on this decision?


Consider if it was...

You would be able to add anything of the parent type to the list, which may not be what it was formerly declared as, which as the above example demonstrates, causes all sorts of problems. Thus, it is not allowed.

0 投票
3 回答
557 浏览

c# - 对非泛型类型的协方差支持?

我想知道为什么 C# 团队决定不支持非泛型的协变/逆变,考虑到它们可能同样安全。这个问题相当主观,因为我不希望团队成员做出回应,但有人可能拥有我(和 Barbara Liskov)缺乏的洞察力。

让我们看一下这个示例界面:

以下实现将失败,尽管完全安全(我们总是可以在不违反接口的情况下返回更具体的类型 - 不是在 C# 中,但至少在理论上是这样)。

如果接口包含 setter,代码自然不会安全,但这不是限制整体实现的理由,因为可以通过使用 out/in 来声明安全性来指出这一点,就像泛型一样。

0 投票
3 回答
1977 浏览

c# - IList 在 c# 中使用协变和逆变,这可能吗?

这可能吗?(我没有vs.2010,所以我不能自己尝试,对不起)

如果我做对了,您可以使用它在同一接口中实际实现协变和逆变。

0 投票
4 回答
2492 浏览

c++ - 有没有办法转发声明协方差?

假设我有这些抽象类FooBar

进一步假设我有派生类ConcreteFooConcreteBar. 我想协变地改进foo()bar()方法的返回类型,如下所示:

这不会编译,因为我们心爱的单通道编译器不知道ConcreteBar它将继承自Bar,因此这ConcreteBar是一个完全合法的协变返回类型。简单的前向声明ConcreteBar也不起作用,因为它不会告诉编译器任何有关继承的信息。

这是我必须忍受的 C++ 的一个缺点,还是实际上有办法解决这个困境?