美文网首页
.NET中的逆变和协变

.NET中的逆变和协变

作者: ArimaKisho | 来源:发表于2017-08-29 09:59 被阅读9次

协变,可以理解成:父类 -> 子类。父类的对象用子类替换,也可以理解成子类当父类用。

抗变,可以理解成:子类 -> 父类。子类的对象用父类替换,也可以理解成父类当子类用。抗变也常常翻译为逆变。

在c#的语言中,很多地方的调用已经隐藏了协变和抗变的使用。函数的返回类型默认是抗变的。例如,函数Func的返回类型为string,我们可以将返回的值赋给object对象。

函数的参数类型则默认是协变的。例如,函数Act的输入参数为object类型,实际操作中我们可以将string类型的对象传给函数。

在泛型接口的定义中,如果泛型类型T用out关键词标注,这个泛型接口就是协变的。而且在接口的代码里面,T只能用作返回类型,不能用作参数类型。

如果泛型类型T用in关键词标注的话,这个接口就是抗变的。在接口的代码里面,T只能用作函数的参数类型,而不能用作返回类型。

1、什么是协变、逆变?

假设:TSub是TParent的子类。

协变:如果一个泛型接口IFoo,IFoo可以转换为IFoo的话,我们称这个过程为协变,IFoo支持对参数T的协变。

逆变:如果一个泛型接口IFoo,IFoo可以转换为IFoo的话,我们称这个过程为逆变,IFoo支持对参数T的逆变。

2、为什么要有协变、逆变?

通常只有具备继承关系的对象才可以发生隐式类型转换,如Base b=new sub()。

协变和逆变可以使得更多的类型之间能够实现隐式类型转换、类型安全性有了保障。

3、为什么泛型接口要引入协变、逆变?

基于以上原因的同时、许多接口仅仅将类型参数用于参数或返回值。所以支持协变和逆变后泛型的使用上有了更大的灵活性

4. 为什么协变和逆变对泛型有很多限制?

否则的话,这样的类型转换不安全。

相关文章

  • .NET中的逆变和协变

    协变,可以理解成:父类 -> 子类。父类的对象用子类替换,也可以理解成子类当父类用。 抗变,可以理解成:子类 ->...

  • 简明数据结构源码阅读(二)-- LinkedList

    推荐阅读时间:20min+ 目录: 回顾ArrayList中的JDK bug的由来以及Java中的逆变和协变 Li...

  • Flow中对逆变和协变的处理

    协变逆变不变的解释 协变:f(Employee) extend f(Person) 逆变:f(Person) ...

  • Java泛型学习笔记(2)

    书接上回,这次我们来研究下泛型的另一个特性,泛型方法和协变逆变。 Whaaat?什么是协变逆变?别着急我看的时候也...

  • Java和Kotlin泛型笔记

    在日常编程中, 我们经常会用到泛型, 用的时候感觉并不复杂, 然而最近在做Kotlin开发时, 被其中的逆变和协变...

  • 2019-06-18PHP版本7.1-7.2

    新特性 新的对象类型 这种新的对象类型,object, 引进了可用于逆变(contravariant)参数输入和协...

  • Scala教程之:深入理解协变和逆变

    在之前的文章中我们简单的介绍过scala中的协变和逆变,我们使用+ 来表示协变类型;使用-表示逆变类型;非转化类型...

  • 泛型编程中的型变

    在泛型编程中,经常会提到型变。型变分为两种:协变与逆变。协变covariant表示与泛型参数T的变化相同,而逆变c...

  • Java中的桥接方法与泛型的逆变和协变

    泛型的协变和逆变是什么?对应于Java当中,协变对应的就是,而逆变对应的就是

  • JAVA泛型与类型安全

    1. 基础泛型 2. 协变与逆变与不变 协变 简单来说即: Java中的数组是协变的 逆变与协变相对,逆转了类型关...

网友评论

      本文标题:.NET中的逆变和协变

      本文链接:https://www.haomeiwen.com/subject/esxodxtx.html