文档章节

协变性与逆变性 和类型拓延符的使用

_
 ___大黄蜂___
发布于 2016/07/23 22:36
字数 477
阅读 7
收藏 0

协变性与逆变性

    因为有了泛型集合的概念,相比之前,我们的类型实际上更加复杂了,比如还拿我们自定义的集合类型来举例:

MyArray<NSString *> * array;
MyArray<NSMutableString *>*muArray;

array和muArray在编译器看来已经是不同的类型,如果我们强行转换,会报如下的警告:

因此,就有了逆变和协变这个概念:

__covariant :子类型指针可以向父类型指针转换

__contravariant:父类型指针可以向子类型转换

上面的情况,我们将自定义的类做如下修改,就不会出现警告:

[@interface](http://my.oschina.net/u/996807) MyArray<__covariant Type> : NSObject @property(nonatomic,strong,nonnull)NSMutableArray<Type> *array; -(void)addObject:(nonnull Type)obj; [@end](http://my.oschina.net/u/567204) 四、类型延拓符的应用

    在开发中,开发者经常会遇到这样的情况,例如通过tag获取某些UI控件时,viewWithTag方法通常会返回给我们一个UIView类型的指针,这就需要开发者手动的强转一下,十分麻烦。新增加的__kindof修饰符可以帮助我们解除这个烦恼。我们还从自定义的那个数组类开刀,对其添加一个属性:

[@interface](http://my.oschina.net/u/996807) MyArray<__covariant Type> : NSObject @property(nonatomic,strong,nonnull)NSMutableArray<Type> *array; @property(nonnull,strong,nonatomic)NSMutableArray<UIView *> * viewArray; -(void)addObject:(nonnull Type)obj; @end 创建一个自定义的数组对象,并向其中添加一个UIButton,我们会看到有如下一个警告:

这也是我们开发中常遇到的问题,对吧,以前需要强转。但是以后就不需要了,我们在声明这个数组时加上一个__kindof修饰符:可以不再进行强转

@property(nonnull,strong,nonatomic)NSMutableArray<__kindof UIView *> * viewArray; 警告就消失了,很cool吧。

这个修饰符就是告诉编译器,这里可以返回UIView的子类指针。

© 著作权归作者所有

共有 人打赏支持
_
粉丝 5
博文 26
码字总数 21716
作品 0
东城
私信 提问
协变和逆变(转载)

前言 个人感觉协变(Covariance)与逆变(Contravariance)是 C# 4 中最难理解的一个特性了,因为 C# 4 用了一个非常直观的语法(和关键字),在很多情况下,这似乎很简单,用于输入的参数,用于...

jeffcky
2015/08/15
0
0
协变和逆变之疑问

前言 关于协变和逆变已经有很多园友谈论过了,学习时也参考过园友们的文章,非常之到位!尤其是园友LoveJenny的,参看时自己也有敲代码加理解,但是出现一个问题,甚是不解,请看下面。【注】...

jeffcky
2015/08/02
0
0
c#中关于协变性和逆变性(又叫抗变)详解

  今天回忆了之前看的《深入理解C#》这本书中的泛型章节,其中对泛型的可变性的理解。泛型可变性分两种:协变和逆变。逆变也又称为抗变。  怎么理解这两个名词的意思:   ①:协变即为在...

奥斯卡的肌肤
08/20
0
0
Java中逆变与协变

看下面一段代码 Number num = new Integer(1); ArrayList<Number> list = new ArrayList<Integer>(); //type mismatch List<? extends Number> list = new ArrayList<Number>();list.add(new......

Hosee
2016/02/25
159
0
Java泛型的协变、逆变和不变

背景 平时在看一些开源框架源码时总发现他们会或多或少的用到泛型来定义数据类型。这可以理解,毕竟牛逼的开源框架大都是为了解决一类普遍问题而存在的;但看不懂的是,有时参数或者返回值会...

JarryWell
07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

微服务分布式事务实现

https://www.processon.com/view/link/5b2144d7e4b001a14d3d2d30

WALK_MAN
今天
2
0
《大漠烟尘》读书笔记及读后感文章3700字

《大漠烟尘》读书笔记及读后感文章3700字: 在这个浮躁的社会里,你有多久没有好好读完一本书了? 我们总觉得自己和别人不一样,所以当看到别人身上的问题时,很少有“反求诸己”,反思自己。...

原创小博客
今天
4
0
大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
今天
3
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
今天
3
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部