文档章节

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

_
 ___大黄蜂___
发布于 2016/07/23 22:36
字数 477
阅读 5
收藏 0
点赞 0
评论 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
Java泛型的协变、逆变和不变

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

JarryWell
07/11
0
0
Kotlin学习笔记(一) 关键字

关键字 说明 abstract 抽象声明,被标注对象默认是open annotation 注解声明 by 类委托、属性委托 class 声明类 companion 伴生对象声明 const 声明编译期常量 constructor 声明构造函数 cr...

JackyRiver
05/30
0
0
Scala 高阶函数(high-order function)剖析

Scala 是一种函数式编程语言,也就是说每一个函数都是一个值。Scala 有很简洁的语法用于定义匿名函数、curry 化函数(curried function)、应用函数、偏函数以及嵌套函数等。函数式编程由数学...

Barudisshu
2015/06/30
0
0
谈谈.Net中的协变和逆变

谈谈.Net中的协变和逆变 关于协变和逆变要从面向对象继承说起。继承关系是指子类和父类之间的关系;子类从父类继承所以子类的实例也就是父类的实例。比如说Animal是父类,Dog是从Animal继承的...

长平狐
2012/06/08
78
0
Scala之类型参数化:Type Parameterization

Scala之类型参数化:Type Parameterization 本文原文出处: http://blog.csdn.net/bluishglc/article/details/52584401 严禁任何形式的转载,否则将委托CSDN官方维护权益! 型变:Variance 型...

bluishglc
2016/09/19
0
0
Scala之“逆变”合理性的思考

Scala之“逆变”合理性的思考 对于逆变的概念可以参考本系列的前一篇文章: Scala之类型参数化:Type Parameterization 本文的重点是要解释“逆变”的合理性。本文原文出处: http://blog.csd...

bluishglc
2016/09/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring配置xml启动报错 Connot find 'beans'

1.我们先看一下spring的原始配置 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSc......

江湖鱼大虾
8分钟前
0
0
与女儿谈商业模式 (4):戴尔的成功秘诀

分类:与女儿谈商业模式 | 标签: 戴尔 经济学 陈志武 2007-05-15 10:26阅读(7434)评论(36)   2007年5月《创富志》与“女儿谈商业模式”专栏 (之四)   戴尔的成功秘诀   陈志武   ...

祖冲之
18分钟前
0
0
www.w3.org被qiang导致logback报错:Connect reset

web项目部署到tomcat后,web项目中的logback不能运行,报错信息如下: Reported exception: ch.qos.logback.core.joran.spi.JoranException: I/O error occurred while parsing xml file......

浮躁的码农
32分钟前
0
0
JDeveloper中文乱码解决

全局设置字体; 全局设置环境编码; 项目设置编译器环境编码。

wffger
今天
2
0
MySQL主从介绍 , 准备工作,配置主,配置从, 测试主从同步

MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步的 MySQL主从是基于binlog的,主上须开启bin...

TaoXu
今天
2
0
线性代数学习总结

亭子happy
今天
1
0
Java8:Lambda表达式增强版Comparator和排序

1、概述 在这篇教程里,我们将要去了解下即将到来的JDK 8(译注,现在JDK 8已经发布了)中的Lambda表达式——特别是怎样使用它来编写Comparator和对集合(Collection)进行排序。 这篇文章是...

孟飞阳
今天
0
0
从架构到组件,深挖istio如何连接、管理和保护微服务2.0?

近几年我一直从事于微服务系统的设计以及实现方面的工作,属于微服务架构一线实践者。之前做过一些单体系统的微服务改造,在微服务拆分、治理等方面都有一定的经验。 本人比较特殊一点的经历...

xiaomin0322
今天
1
0
基于vue的h5文件切片上传(获取文件md5,实现秒传、进度条实现)

template <button @click="file"></button><label ref="upload" style="position: relative;"> <input type="file" @change="selectFile" style="position: abs......

hkaikai
今天
2
0
Spring Boot 2.0 项目实现自同步AD域账号

在通过Spring Boot的自动化装配功能及JDK自带的LDAP模块,可通过如下几个简单步骤实现业务系统自动同步AD域账号功能。 1. Java自带ldap搜索域账号信息核心代码: try { LdapContext ctx...

B超
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部