文档章节

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

_
 ___大黄蜂___
发布于 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
东城
Visual Studio 2010与c#4.0新特性(1)--Variance-变性

Variance变性 泛型的某个方面会让人感到奇怪,比如下面的代码是不合法的—— IList<string> strings = new List<string>(); IList<object> objects = strings; 第二个赋值是不允许的,因为s......

junwong
2012/03/09
0
0
协变和逆变(转载)

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

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

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

jeffcky
2015/08/02
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
c#中关于协变性和逆变性(又叫抗变)详解

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

奥斯卡的肌肤
08/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

马太效应

马太效应

yizhichao
16分钟前
0
0
69.for while循环 continue break exit

20.10 for循环 20.11/20.12 while循环 20.13 break跳出循环 20.14 continue结束本次循环 20.15 exit退出整个脚本 扩展 select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html 20.10......

王鑫linux
25分钟前
0
0
完整的软件开发流程是怎样的

在it圈混迹了这么久,做过各种各样的工作。但是我确一直不知道一个软件从无到有到底是怎么开发的。于是就产生了强烈的好奇心:一个软件产品的结果为什么是这样?为什么开发的速度不能再快一点...

TreasureWe
31分钟前
0
0
深度学习与图像处理之:人像背景虚化

简单实现思路: 对图像内容进行分割,提取人像 对图像背景进行模糊化处理 将人像和背景重新合成 在这里,使用DeepLabV3模型对图像内容进行分割并提取人像,实现的代码如下: import numpy a...

IOTService
33分钟前
0
0
20180918上课截图

小丑鱼00
41分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部