美文网首页
集合类型的泛型 _ _covariant (部分转载)

集合类型的泛型 _ _covariant (部分转载)

作者: 小曼blog | 来源:发表于2020-04-23 16:01 被阅读0次

在iOS的开发中,我们经常使用集合类型,那么有没有注意到集合类型定义的后面跟的小尖括号里的东西呢?他是什么呢?为何NSString没有呢?好奇心驱使下,来一探究竟。

先来看看集合类型的定义的截图吧

NSArray:


image.png

NSSet:


image.png

NSDictionary:


image.png

类的定义的后面都有个小小的尖括号,尖括号中的内容不尽相同,但是都有个关键字 _ _covariant ,它是什么?干嘛用的?

看看Foundation的别的类有么?


image.png image.png
image.png

它们都没有_ covariant 。 _covariant 到底是什么嘞?

以下内容为转载

一.泛型作用

泛型:限制类型

为什么要推出泛型?迎合swift

泛型作用:1.限制类型 2.提高代码规划,减少沟通成本,一看就知道集合中是什么东西

二.泛型用法:

__covariant:协变, 子类转父类

__contravariant:逆变 父类转子类

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

//第一步 声明泛型

@interface Person<__covariant ObjectType> : NSObject

// 语言

@property (nonatomic, strong) ObjectType language;

2.使用泛型 类型<限制类型>

// iOS

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

p.language = ios;

不遵守泛型仅仅是报警告

三.泛型在开发中的使用

泛型在开发中使用场景:1.用于限制集合类型

泛型好处:

1.从数组中取出来,可以使用点语法
2.给数组添加元素,有提示

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

限制数据里面的集合是NSString
id是不能使用点语法

泛型注意点:在数组中,一般用可变数组添加方法,泛型才会生效,如果使用不可变数组,添加元素,泛型没有效果

四.泛型使用举例

什么时候使用泛型?在声明类的时候,不确定某些属性或者方法类型,在使用这个类的时候才确定,就可以采用泛型

自定义Person,会一些编程语言(iOS,Java),在声明Person,不确定这个人会什么,在使用Person才知道这个Person会什么语言

如果没有定义泛型.默认就是id

<一>.先自定义类

1.自定义Person类.里面有一个language属性,不知道是什么类型的,自定义为泛型,并且添加协变和逆变

//  Person.h

#import <Foundation/Foundation.h>

//第一步 声明泛型

//__covariant 协变,子类转父类   泛型名字是ObjectType

@interface Person<__covariant ObjectType> :NSObject

// 语言

@property (nonatomic,strong) ObjectType language;

@end

2.Language : NSObject
#import <Foundation/Foundation.h>

@interface Language : NSObject

@end

3.Java : Language
#import "Language.h"

@interface Java : Language

@end

4.iOS : Language
#import "Language.h"

@interface iOS : Language

@end


<二>定义好了,下面介绍如何使用
1.首先是没有协变和逆变
#import <Foundation/Foundation.h>

// 泛型名字是ObjectType

@interface Person<ObjectType> : NSObject

// 语言

@property (nonatomic,strong) ObjectType language;

@end


- (void)test

{

    Java *java = [[Javaalloc]init];

    iOS *ios = [[iOSalloc]init];

    

    // iOS  指定这个人会的是iOS

    Person<iOS *> *p = [[Personalloc]init];

    p.language = ios;

    

    // Java   指定这个人会的是Java

    Person<Java *> *p1 = [[Personalloc]init];

    p1.language = java;



}


2.添加了协变
#import <Foundation/Foundation.h>

//第一步 声明泛型

//__covariant 子类转父类   泛型名字是ObjectType

@interface Person<__covariant ObjectType> : NSObject

// 语言

@property (nonatomic, strong) ObjectType language;

@end


// 子类转父类

- (void)covariant

{

    iOS *ios = [[iOSalloc]init];

    Language *language = [[Languagealloc]init];

    // iOS 只会iOS

    Person<iOS *> *p = [[Personalloc]init];

    p.language = ios;

    

    // Language 都会

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

    p1 = p;

//如果没添加协变会报指针类型错误警告

}


3.添加了逆变
#import <Foundation/Foundation.h>

//第一步 声明泛型

//__contravariant 可以逆变,父类转子类   泛型名字是ObjectType

@interface Person<__contravariant ObjectType> : NSObject

// 语言

@property (nonatomic, strong) ObjectType language;

@end


- (void)contravariant {

    //第二步 定义泛型

    iOS *ios = [[iOSalloc]init];

    Language *language = [[Languagealloc]init];

    

    // 父类转子类  都会

    Person<Language *> *p = [[Personalloc]init];

    p.language = language;

    

    // iOS  只会iOS

    Person<iOS *> *p1 = [[Personalloc]init];

    p1 = p;  

//如果没添加逆变会报指针类型错误警告

}

转载地址:https://blog.csdn.net/imkata/article/details/78859482

备注:转载内容没有机试

相关文章

  • 集合类型的泛型 _ _covariant (部分转载)

    在iOS的开发中,我们经常使用集合类型,那么有没有注意到集合类型定义的后面跟的小尖括号里的东西呢?他是什么呢?为何...

  • iOS9新特性之泛型 和__kindof

    泛型:限制类型 __covariant(协变):用于泛型数据强转类型,可以向上强转,子类 可以转成 父类__con...

  • C#基础提升系列——C#集合

    C#集合 有两种主要的集合类型:泛型集合和非泛型集合。 泛型集合被添加在 .NET Framework 2.0 中...

  • 四、Java高级--1、泛型

    泛型定义:数据类型参数化,提前定义好集合中放入什么类型集合框架中没使用泛型和使用泛型的比较 泛型规则和限制1、泛型...

  • (转)C# 集合类型(常用集合类型整理)

    一、常用集合类型及概念 1.基本关系 许多泛型集合类型均为非泛型类型的直接模拟。 Dictionary< TKey...

  • 泛型——Dart(五)

    泛型 从字面意思理解,就是广泛的类型,我们可以在集合中看到泛型的影子: 为什么要有泛型? 以集合为例,假如没有泛型...

  • Java笔记——泛型的学习总结

    泛型的定义 泛型即泛化类型,也可以称为参数化类型。一般情况下使用在集合中。如果把集合类比成瓶子,那么泛型就是瓶子上...

  • Java泛型详解

    泛型 泛型由来 泛型字面意思不知道是什么类型,但又好像什么类型都是。看前面用到的集合都有泛型的影子。 以Array...

  • Java基础

    1、泛型 jdk1.5增加了泛型支持很大程度是为了让集合记住其元素的类型。知识点:泛型类、泛型接口、类型通配符、泛...

  • 《Kotlin入门实战》CH8 | 泛型

    泛型 泛型是在Java5中引入的,泛型让集合框架可以重用代码,在没有泛型时候,集合框架中存储数据的类型都是Obje...

网友评论

      本文标题:集合类型的泛型 _ _covariant (部分转载)

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