原文地址
谈谈.Net中的协变和逆变关于协变和逆变要从面向对象继承说起。继承关系是指子类和父类之间的关系;子类从父类继承所以子类的实例也就是父类的实例。比如说Animal是父类,Dog是从Animal继承的子类;如果一个对象的类型是Dog,那么他必然是Animal。协变逆变正是利用继承关系 对不同参数类型或返回值类型 的委托或者泛型接口之间做转变。我承认这句话很绕,如果你也觉得绕不妨往下看看。如果...
逆变和协变在存在于强类型语言中,虽然很少提及,但是里面蕴含了对问题的描述。感谢和我一起讨论的人。
这里,使用C#、Scala中都包含逆变的参数声明方式。
一、逆变的定义
逆变的参数可以由指定的类型的子类型代替,Scala中的逆变声明:Function1[-A,+B] ;参数可以使用A类型或者A类的子类型。
二、协变与逆变的用途不同
1.语义
常见的地方用在Fun...
分类:
其他好文 时间:
2015-07-14 17:57:06
阅读次数:
435
c# 4.0中的新特性 协变、逆变如果一个类是另一个类的直接或者间接基类,那么它为弱类型,直接或者间接子类为强类型。协变就是将TBar类型的实例赋值给TFoo类型的变量,而逆变则是将TFoo类型的实例赋值给TBar类型的变量。理解:协变是将子类实例复制给父类的实例,逆变是将父类实例赋值给子类实例。h...
【1】.NET泛型解析(上)【2】.NET泛型解析(下)【3】.NET可变性解析(协变和逆变)【4】.NET委托解析【5】.NET解析(异步委托)【6】.NET解析(反射)【7】.NET解析之线程【8】.NET解析(面向接口编程)【9】.NET解析之CLR内存处理机制【10】.NET解析之CLR垃圾...
分类:
Web程序 时间:
2015-06-30 10:21:21
阅读次数:
121
转载请注明出处:jiq?钦's
technical Blog
1
泛型语法:
泛型类: class ClassName{}
泛型方法:public void f(T x){}
基本指导原则:如果使用泛型方法可以取代将整个类泛型化,那么就应该使用泛型方法,因为它可以让事情更加清楚。
2
为什么使用泛型?
在Java SE1.5之前,没有泛型的情况的下,通过对类型...
分类:
编程语言 时间:
2015-06-29 06:32:49
阅读次数:
173
【一】何为可变性可变性是.NET4.0中的一个新特性,可变性可分为 : 协变性、逆变性、不可变性.那么在.NET4.0之前是否有可变性? 答案是肯定的,我们可以通过下面的几个实例来简单的了解一下.NET4.0之前的协变和逆变.实例 1 : 方法参数的协变static void Main(string...
分类:
Web程序 时间:
2015-06-23 11:26:55
阅读次数:
169
那么先讲讲什么是“泛型类协变”你可以这样理解,正常的变换 好比object = String
这样的表达式一样协变主要是向上安全的变换,但是需要根据继承链条一层一层
的向上变化 而不需要进行转换因为是隐式转换,先上一层继承类的代码 不过使
用最容易的理解的,你认为是拆箱与装箱也没什么太大的出入 但是指泛型上的...
看过几篇说协变与逆变的博客,虽然都是正确无误的,但是感觉都没有说得清晰明了,没有切中要害。那么我也试着从我的理解角度来谈一谈协变与逆变吧。什么是协变与逆变MSDN的解释:https://msdn.microsoft.com/zh-cn/library/dd799517.aspx协变和逆变都是术语,前...
java se5中添加了协变返回类型,他表示在到处类中的被覆盖方法可以返回基类方法的返回类型的某种导出类型class Grain(){public String toStinrg(){return "Grain";}}class Wheat extends Grain(){public String...
分类:
其他好文 时间:
2015-06-10 01:05:16
阅读次数:
115
可变类型形参列表(*variant-type-parameter-lists) 可变类型形参列表(variant-type-parameter-lists )只能在接口和委托类型上出现。它与普通的type-parameter-lists的差异在于,它的每个类型形参前面可以加上变化性批注:in和out。
如果前面的变化性批注为out,则该类型形参成为协变类型形参;如果变化批注为in,则该类型形...