逆变协变

Posted 西伯利亚的狼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逆变协变相关的知识,希望对你有一定的参考价值。

泛型来源

没有泛型的时候。大家要写很多方法相同的方法,就是参数不一样。后面大家想了一个方法用Object类型作为参数。

随着.net 和编译器的升级

出现了泛型

1类型安全    。类型是明确指定的,不会出现类型转化的问题。 将运行时的错误转换到了编译时期

2减少拆箱装箱。   上面说的   参数用Object类型, 这样就要进行一次装箱拆箱。   性能对比  原生方法>泛型方法>Object参数方法

3方法复用

泛型原理

泛型编译完之后变成具体的类型,就是产生了很多对应的类,对应的方法。

泛型约束

指定泛型类型继承某个类 或者接口,有构造函数 只能是无参数的。

适用范围

协变逆变在接口泛型和委托泛型中而言

协变

把子类赋值给父类。OUT只能修饰输出参数。

IEnumerable<Para> lp = new List<Chid>();
IMyCustomList<Para> c = new MyCustomList<Chid>();

逆变

把父类赋值给子类。IN只能修饰输入参数。

IMyCustomList<Chid> c = new MyCustomList<Para>();

 

面向对象中任何父类都可以用子类表示,就是把子类赋值给父类。但是不能把父类赋值给子类。

 源码下载

以上是关于逆变协变的主要内容,如果未能解决你的问题,请参考以下文章

[JAVA冷知识]什么是逆变(contravariant)与协变(covariant)?数组是否支持协变&逆变?泛型呢?

Typescript 中的协变和逆变

协变和逆变之疑问

Java泛型中的协变和逆变

Java进阶知识点2:看不懂的代码 - 协变与逆变

如何检查函数中元素的协变和逆变位置?