【深入Java泛型】(4)Java泛型-协变、逆变

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

泛型作用:

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;

欢迎关注公众号:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值