• 简单搞懂逆变与协变


    本质:里氏替换原则  子类可以代替父类   如  object = string  等式成立  但是在类里面IFunc<object> != IFunc<string>   本质是要解决泛型的入参出参问题 

    PS  值类型不能变

    先理解引用对象方法的问题   这里有两种泛型方法

    方法一
    pulic class IFunc<T>{ pulic void IFunc( 入参 T ){ return } }
    方法二
    pulic class  IFunc<T>{
    
    pulic  T  IFunc( ){   return  返回值 }
    
    }

     F(A) = F(B) 这个意思就F(A)引用了F(B)的地址
    方法执行流程就是 F(A)的入参传给F(B)的入参 F(B)的返回值传给F(A) 这两个传递过程中要符合里氏替换原则
    在了解上面的知识点的前提下 再来看逆变协变

    协变  out

    概念 : F(父) = F(子) 成立       

     例:  IFunc<object> = IFunc<string>  

    套入上面方法执行流程   是object传给string 符合里氏替换原则还是 string传给object 符合呢  那很显然 是 属于返回值的传入的也就是方法二

    那么我们标识一下这个T代表的是返回值 让编译器可以识别  这也就是协变

    pulic class  IFunc<out T>{
    
    pulic  T  IFunc( ){   return  返回值 }
    
    }

    逆变  in

    概念 : F(子) = F(父) 成立       

     例:  IFunc<string> = IFunc<object>  

    同理  套入上面方法执行流程   是object传给string 符合里氏替换原则还是 string传给object 符合呢  那很显然 是 属于入参的传入的也就是方法一

    那么我们标识一下这个T代表的是入参值 让编译器可以识别  这也就是逆变

    pulic class  IFunc<in T>{
    
    pulic  void  IFunc( 入参 T ){   return   }
    
    }

    参考:https://www.cnblogs.com/CLR010/p/3274310.html

       https://www.cnblogs.com/liuzhenbao/p/12638103.html

  • 相关阅读:
    机器学习学习记录【持续更新】——pandas
    机器学习学习记录【持续更新】——降低损失
    Robcup2D足球学习记录【2020.01.30】
    Robcup2D足球学习记录【2020.01.18】
    Robcup2D足球学习记录【2020.01.14】
    javacript window对象
    mybatis if 语句嵌套
    hashMap 和 linkedHashMap 的区别和联系
    var let const的一些区别
    Jetty9开发(1)
  • 原文地址:https://www.cnblogs.com/liagon/p/15421094.html
Copyright © 2020-2023  润新知