逆变协变
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)?数组是否支持协变&逆变?泛型呢?