首先,我已经阅读了关于协议和反变换的SO和博客的许多解释,并且非常感谢Eric Lippert在协变和逆变方面创作了这样一个系列。 然而,我有一个更具体的问题,我正试图让我的头稍微有点。 据我所知, 埃里克的解释是,协变和逆变都是描述转换的形容词。 协变变换是保持types顺序的变换,逆变换是逆转变换的变换。 我以这样的方式理解协变性,我认为大多数开发人员直观地理解。 //covariant operation Animal someAnimal = new Giraffe(); //assume returns Mammal, also covariant operation someAnimal = Mammal.GetSomeMammal(); 这里的返回操作是协变的,因为我们正在保持动物比哺乳动物或长颈鹿更大的尺寸。 在这一点上,大多数返回操作是协变的,逆变操作是没有意义的。 //if return operations were contravariant //the following would be illegal //as Mammal would need to be stored in something //equal to or less derived than Mammal //which would mean that […]
我想从网上的几篇文章和StackOverflow上的问题中Contravariance Covariance和“ Contravariance ”一词的确切含义,从我能理解的情况来看,这只是多态的另一个词 。 我是否正确的以上陈述? 还是我错了?
请在Java中展示协变和逆变的一个好例子。
我在C#上阅读的教科书中遇到过这些问题,但是由于缺乏上下文,我很难理解它们。 有一个很好的简洁的解释,他们是什么,他们在那里有什么用? 编辑澄清: 协变界面: interface IBibble<out T> . . 反变化界面: interface IBibble<in T> . .
我无法理解协方差和逆变之间的差异。
我没有参加PDC 2008,但是我听到一些消息说C#4.0被宣布支持Generic协方差和反方差。 也就是说, List<string>可以被分配给List<object> 。 那怎么可能? 在Jon Skeet的书“ 深度C#”中 ,解释了为什么C#generics不支持协方差和反方差。 主要是为了编写安全的代码。 现在,C#4.0更改为支持它们。 会不会带来混乱? 有人知道关于C#4.0的细节可以给一些解释吗?
IEnumerable<T>是co-variant,但不支持值types,只是引用types。 下面的简单代码编译成功: IEnumerable<string> strList = new List<string>(); IEnumerable<object> objList = strList; 但是从string为int会得到编译错误: IEnumerable<int> intList = new List<int>(); IEnumerable<object> objList = intList; 原因在MSDN中解释: 差异仅适用于参考types; 如果为变体types参数指定值types,则该types参数对于生成的构造types是不变的。 我search了一下,发现有些问题提到了原因是值types和引用types之间的装箱 。 但是,为什么拳击就是这个原因,这并不能说明我的心意? 有人能给一个简单和详细的解释,为什么协变和逆变不支持价值types, 拳击如何影响这个?
继这个问题之后 ,有人可以在Scala中解释以下内容: class Slot[+T] (var some: T) { // DOES NOT COMPILE // "COVARIANT parameter in CONTRAVARIANT position" } 我理解类型声明中的+T和T之间的区别(如果我使用T则编译它)。 但是如何在没有参数化的情况下写一个类型参数协变的类呢? 我怎样才能确保以下只能创建一个T的实例? class Slot[+T] (var some: Object){ def get() = { some.asInstanceOf[T] } } 编辑 – 现在把它归结为以下内容: abstract class _Slot[+T, V <: T] (var some: V) { def getT() = { some } } 这一切都很好,但我现在有两个类型参数,我只想要一个。 […]