• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
gw2010
重新编程
博客园    首页    新随笔    联系   管理    订阅  订阅
协变抗变

>协变与抗变(逆变)

>总说 协变就是从子类型到父类型的变化,顺着来叫着协变,如 Shape s=new Rectangle();

抗变就是从类型到子类型的变化,逆着来叫抗变,这种情况的例子很少

>委托中的协变和抗变 可以用一句语来说明 在委托中返回类型支持协变的,参数类型是支持抗变

的。

比如 delegate Shape D(); //要返回Shape的方法才能接受 //但是因为委托返回类型支持协变,所以 Rectangle Foo(){}

D d=Foo;//这样是可以,因为返回值是协变的 可以参考Shape s=new

Rectangle();

//下面看参数类型支持抗变 delegate void D(Rectangle r); //安理这里要接受Rectangle类型的方法

才行,但是因为委托参数支持抗变,所以 void Foo(Shape s){}

D d=Foo; //这样也是可以的。

>再看泛型接口中的协变坑变  在有了前说明的基础上就好理解这个了,刚才说了委托返回值是协变的,

参数是抗变的。所以泛型接口定义中out,in两个关键字来支持协变和抗变。 比如 public interface IX<out T>{} 这个接口是支持协变的 那么 我们可以这样用 IX<Rectangle> bbb=new X<Rectangle>(); IX<Shape> aaa=bbb;//协变

public interface IX<in T>{} 这个接口是支持抗变的 那么 IX<Shape> bbb=new X<Shape>(); IX<Rectangle> aaa=bbb;//抗变

>还有一部分是泛型委托中的协变抗变 同理 public delegate T D<out T>();这个是协变的 public delegate void D<in T>();这个是抗变的 所以 D<Rectangle> b=xxx; D<Shape> a=b; 下面个可以 D<Shape> b=xxx; D<Rectangle> a=b;

其实大体分成两类,一类是委托的协变和逆变 一类是泛型的协变和抗变,泛协里面就是接口和委托泛型 微软恰恰把泛型这一部分叫协变和抗变,把委托的叫协变和逆变,难道这是

区分一下?不过这样子读也恰好简单的分类一下吧。

-----------------------

又改动了一下,之前理解有误啊,现在不知道正确否,如果有大神看见不对的地方望指正。

-----------------------------------------------------

[2017-06-14]

返回值协变,参数抗变 分别用out in;

声明本博客文章未特殊注明均为原创,转载请注明作者和原地址。 博客地址:http://www.cnblogs.com/gw2010/ 博客首发:http://www.zhou2019.cn
posted on 2013-11-29 13:28  gw2010  阅读(230)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3