Questions tagged «covariance»

协方差,相反方差和不变性描述了现有类型继承层次结构在进行某种转换(例如泛型中的用法)时如何变化。如果转换保持原始层次结构的顺序,则它是“协变量”。如果反转,则为“相反”。如果它破坏了它,则它是“不变的”。



9
协方差和反方差的真实世界示例
我在理解如何在现实世界中使用协方差和逆方差时遇到了一些麻烦。 到目前为止,我所看到的唯一示例是相同的旧数组示例。 object[] objectArray = new string[] { "string 1", "string 2" }; 如果能看到其他地方使用的示例,那么很高兴能在开发期间使用它。
162 c#  c#-4.0  covariance 

8
为什么数组是协变的,而泛型是不变的?
摘自Joshua Bloch的Effective Java, 数组在两个重要方面不同于通用类型。第一数组是协变的。泛型是不变的。 协变量仅表示如果X是Y的子类型,则X []也将是Y []的子类型。数组是协变的,因为字符串是Object的子类型,所以 String[] is subtype of Object[] 不变式仅表示X是否为Y的子类型, List<X> will not be subType of List<Y>. 我的问题是为什么要在Java中使数组协变的决定?还有其他SO帖子,例如“ 为什么数组不变”,但“列表协变”?,但是它们似乎专注于Scala,我无法跟踪。

4
为什么协方差和逆方差不支持值类型
IEnumerable<T>是协变的,但它不支持值类型,仅支持引用类型。下面的简单代码已成功编译: IEnumerable<string> strList = new List<string>(); IEnumerable<object> objList = strList; 但是从更改string为int会得到编译错误: IEnumerable<int> intList = new List<int>(); IEnumerable<object> objList = intList; 原因在MSDN中进行了解释: 方差仅适用于引用类型;如果为变量类型参数指定值类型,则该类型参数对于生成的构造类型而言是不变的。 我搜索后发现,提到的一些问题的原因是值类型和引用类型之间的装箱。但这仍不能使我清楚为何拳击是原因? 有人可以给出一个简单而详细的解释,为什么协变量和协变量不支持值类型,以及装箱如何影响值类型?


4
该示例为何不编译,又是(协方,对方和内部)方差如何工作?
接着这个问题,有人可以在Scala中解释以下内容: class Slot[+T] (var some: T) { // DOES NOT COMPILE // "COVARIANT parameter in CONTRAVARIANT position" } 我明白之间的区别+T,并T在类型声明(它编译如果我使用T)。但随后一个人如何真正写一个类,这是在其类型参数的协变而不诉诸创造的东西unparametrized?如何确保只能使用实例创建以下内容T? class Slot[+T] (var some: Object){ def get() = { some.asInstanceOf[T] } } 编辑 -现在将其归结为以下内容: abstract class _Slot[+T, V <: T] (var some: V) { def getT() = { some } } …

7
从x到y的协变量数组转换可能会导致运行时异常
我有一个s()的private readonly列表。稍后,我将s 添加到此列表,并将这些标签添加到如下所示:LinkLabelIList<LinkLabel>LinkLabelFlowLayoutPanel foreach(var s in strings) { _list.Add(new LinkLabel{Text=s}); } flPanel.Controls.AddRange(_list.ToArray()); Resharper向我显示警告:Co-variant array conversion from LinkLabel[] to Control[] can cause run-time exception on write operation。 请帮我弄清楚: 这是什么意思? 这是一个用户控件,不会被多个对象访问以设置标签,因此,保持这样的代码不会影响它。

2
问题理解C#中与泛型的协方差
我不明白为什么下面的C#代码无法编译。 如您所见,我有一个带有IEnumerable<T>参数的静态泛型方法Something (并且T被限制为IA接口),并且该参数不能隐式转换为IEnumerable<IA>。 有什么解释?(我不是在寻找解决方法,只是为了了解为什么它不起作用)。 public interface IA { } public interface IB : IA { } public class CIA : IA { } public class CIAD : CIA { } public class CIB : IB { } public class CIBD : CIB { } public static class Test { public …

3
用简单的英语解释协方差,不变性和相反性?
今天,我读了一些有关Java中协方差,协方差(和不变性)的文章。我阅读了英文和德文的Wikipedia文章,以及其他来自IBM的博客文章和文章。 但是我仍然对这些到底是什么感到困惑?有人说这与类型和子类型之间的关系有关,有人说与类型转换有关,有人说它用于确定方法是被重写还是被重载。 因此,我正在寻找一个简单的英语解释,它向初学者展示了协方差和逆方差(以及不变性)。加号是一个简单的例子。

2
在C#4.0中如何实现通用协方差和反方差?
我没有参加PDC 2008,但是我听到一些消息,宣布C#4.0支持通用协方差和反方差。即List<string>可以分配给List<object>。怎么可能 在乔恩·斯基特(Jon Skeet)的《C#in Depth》一书中,解释了为什么C#泛型不支持协方差和逆方差。它主要用于编写安全代码。现在,C#4.0更改为支持它们。会带来混乱吗? 有人知道有关C#4.0的详细信息可以给出一些解释吗?



3
为什么Scala的不可变集的类型不协变?
编辑:根据原始答案改写了这个问题 该scala.collection.immutable.Set班是不是在它的类型参数不变性。为什么是这样? import scala.collection.immutable._ def foo(s: Set[CharSequence]): Unit = { println(s) } def bar(): Unit = { val s: Set[String] = Set("Hello", "World"); foo(s); //DOES NOT COMPILE, regardless of whether type is declared //explicitly in the val s declaration }

2
了解C#中的协变和逆变接口
我在使用C#阅读的教科书中遇到了这些问题,但是由于缺乏上下文,我很难理解它们。 关于它们是什么以及对它们有用的内容,是否有一个很好的简洁解释? 编辑以澄清: 协变介面: interface IBibble<out T> . . 换向接口: interface IBibble<in T> . .

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.