zoukankan      html  css  js  c++  java
  • 泛型中协变和逆变

         写在前面

            今天讲的内容有点多,但是差不多都能听懂,稍微有点模糊的就是协变和逆变的概念,下面是我结合在网上看的资料整合而成的。

          正文

              msdn上的原话:

              协变:是指能够使用比原始指定的派生类型的派生程度更小(不太确定)的类型

              逆变:是指能够使用比原始类型的派生类型的派生程度更大(更具体)的类型

              在方便理解的概念是:

                协变:子类向父类转化,用于返回类型用out关键字

                逆变:父类向子类转化的过程,用于方法参数类型用in关键字

              协变的例子:

                  

     1   public class Person { }
     2 
     3     public class Student : Person { }
     4 
     5     public delegate T MyDelegate<out T>();
     6     class Program
     7     {
     8         static void Main(string[] args)
     9         {
    10             MyDelegate<Student> student = () => new Student();
    11             MyDelegate<Person> person = student;
    12 
    13         }
    14     }
    View Code

         如果这里去掉out关键字就会报不能隐式转化的错误

               逆变的例子:

      

     1   public class Person { }
     2 
     3     public class Student : Person { }
     4 
     5     public interface IFly<in T> { }
     6 
     7     public class FlyImp<T> : IFly<T> { }    
     8     public delegate T MyDelegate<T>(T t);
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13 
    14             IFly<Person> peson = new FlyImp<Person>();
    15             IFly<Student> student = peson;
    16         }
    17     }
    View Code

       如果这里IFly<in T>去掉in 后面也要报隐式转换的错误
        哇,好神奇!

        这里终于理解ms提供的2个委托: Action<in> 和Func<out> 里面的in和out的含义了。

           总结

               通过简单的了解后,有了协变和逆变后,以后写代码可以更灵活,当然这是废话,在敲代码的过程中,虽然简单但是还浪费不少时间,也发现自己眼高手低的毛病,以后要多多实践了。

         

  • 相关阅读:
    169_Majority Element
    171_Excel Sheet Column Number
    217_Contains Duplicate
    242_Valid Anagram
    【findIndex】根据数组对象某一元素的id,找到此元素在数组所在的位置
    【鼠标右击组件】v-contextmenu
    【 拖拽组件】基于 Sortable.js 的 Vue 拖拽组件。 访问地址:Vue.Draggable
    【vue-markdown编辑器】vue-markdown 组件github地址
    mac下如何制作windows启动盘
    【vue webstorm】WebStorm Vue代码格式错误
  • 原文地址:https://www.cnblogs.com/JaggerMan/p/4187582.html
Copyright © 2011-2022 走看看