美文网首页
泛型,协变,逆变详解

泛型,协变,逆变详解

作者: 岩大大 | 来源:发表于2016-12-13 15:40 被阅读0次

很多小伙伴都仅仅知道泛型是限制类型的,其他的就不太清楚了,下面给大家详细讲解一下泛型,以及协变和逆变。

泛型作用:

1.限制类型;

2.提高代码规划,减少沟通成本,一看就知道集合中是什么东西。

泛型声明:在声明类的时候,在类的后面<泛型名称>

泛型定义用法:类型<限制类型>

泛型好处:

1.从数组中取出来,可以使用点语法;

2.给数组添加元素,有提示。

很多人会疑惑,为什么集合可以直接使用泛型?而我们自定义的类中却不能使用泛型,因为,集合已经声明过泛型了,我们可以直接定义使用,可是我们自定义的类却并没有声明泛型。

@interface NSMutableArray<ObjectType>: NSArray<ObjectType>

ObjectType就是泛型的名字,我们可以直接定义使用

@property (nonatomic, strong) NSMutableArray<NSString *>*arr;

注意:在声明中,泛型的名字ObjectType是可以任意取得,当我们在定义泛型的类型是NSString *的时候,ObjectType就会默认成NSString *。

下面给大家讲解一下如何自定义泛型:

自定义Person类和IOS类

声明泛型

#import<Foundation/Foundation.h>

@interface Person<ObjectType>: NSObject

//语言

@property (nonatomic, strong) ObjectType language;

@end

定义泛型

IOS *ios = [[IOS alloc] init];

Person*p = [[Person alloc] init];

p.language = ios;

协变,逆变用于父子类型转换

__covariant:协变  子类转父类

__contravariant:逆变 父类转子类

自定义Person类,Language类和IOS类,IOS类继承自Language类

协变:

子类转父类

#import

@interface Person<__covariant ObjectType>: NSObject

//语言

@property (nonatomic, strong) ObjectType language;

@end

IOS *ios = [[IOS alloc] init];      

//iOS   

Person<IOS *>*p = [[Person alloc] init];   

p.language = ios;      

//Language   

Person<Language *>*p1 = [[Person alloc] init];

p1 = p;

逆变

父类转子类

#import

@interface Person<__contravariant ObjectType>: NSObject

//语言

@property (nonatomic, strong) ObjectType language;

@end

Language *language = [[Language alloc] init];       

//Language

Person*p = [[Person alloc] init];   

p.language = language;       

//iOS   

Person*p1 = [[Person alloc] init];

p1 = p;

相关文章

  • Kotlin学习笔记 - 泛型

    1. 基本用法 2. 型变 型变包括 协变、逆变、不变 三种: 协变:泛型类型与实参的继承关系相同 逆变:泛型类型...

  • Scala 通俗易懂 ---- 协变、逆变、不变

    协变、逆变、不变 Scala 语言中协变、逆变、不变是指拥有泛型的类型,在声明和赋值时的对应关系 协变:声明时泛型...

  • 泛型编程中的型变

    在泛型编程中,经常会提到型变。型变分为两种:协变与逆变。协变covariant表示与泛型参数T的变化相同,而逆变c...

  • Scala 泛型协变与泛型边界

    代码准备 泛型协变 泛型协变、逆变、不变是指拥有泛型的类在声明和赋值时的对应关系。 协变:声明时泛型是父类,赋值时...

  • 泛型,协变,逆变详解

    很多小伙伴都仅仅知道泛型是限制类型的,其他的就不太清楚了,下面给大家详细讲解一下泛型,以及协变和逆变。 泛型作用:...

  • Java协变和逆变

    泛型的协变与逆变 协变与逆变用来描述类型转换(type transformation)后的继承关系,其定义如下:如...

  • JAVA泛型与类型安全

    1. 基础泛型 2. 协变与逆变与不变 协变 简单来说即: Java中的数组是协变的 逆变与协变相对,逆转了类型关...

  • 协变和逆变

    Java的泛型只有通配符?和extends、super,没有语法上的协变和逆变。 什么是协变和逆变? 在混合OO和...

  • Java中的桥接方法与泛型的逆变和协变

    泛型的协变和逆变是什么?对应于Java当中,协变对应的就是,而逆变对应的就是

  • Objective-C 泛型 协变 逆变

    为什么要使用泛型 如何使用泛型 限制泛型 协变 逆变 为什么要使用泛型 在使用NSArray, NSSet, NS...

网友评论

      本文标题:泛型,协变,逆变详解

      本文链接:https://www.haomeiwen.com/subject/secbmttx.html