美文网首页
iOS 泛型 ObjectType 协变 __covariant

iOS 泛型 ObjectType 协变 __covariant

作者: hui8685291 | 来源:发表于2021-06-07 14:26 被阅读0次

泛型使用场景:

  • 在集合(数组、字典、NSSet)中使用泛型比较常见。
  • 当声明一个类,类里面的某些属性的类型不确定,这时候我们才使用泛型。
    泛型书写规范
    在类型后面定义泛型,比如如下所示:
NSMutableArray<UITouch *> *datas

泛型好处:

  • 提高开发规范,减少程序员之间交流
  • 通过集合取出来对象,直接当做泛型对象使用,可以直接使用点语法。

纯白的讲:

  • __covariant(协变):用于泛型数据强转类型,可以向上强转,子类可以转成父类。
  • __contravariant(逆变):用于泛型数据强转类型,可以向下强转,父类可以转成子类。

例如:

// __covariant 协变,子类转父类;泛型名字是ObjectType
@interface Person<__covariant ObjectType> :NSObject

// 语言
@property (nonatomic, strong) ObjectType language;

@end

@interface Language : NSObject

@end

@interface Java : Language

@end

@interface Objective_C : Language

@end

首先是没有添加协变和逆变

@interface Person<ObjectType> : NSObject

// 语言
@property (nonatomic, strong) ObjectType language;

@end

- (void)test {

    Java *java = [[Java alloc]init];
    Objective_C *ios = [[Objective_C alloc]init];

    // iOS  指定这个人会的是iOS
    Person<Objective_C *> *p = [[Person alloc]init];
    p.language = ios;

    // Java   指定这个人会的是Java
    Person<Java *> *p1 = [[Person alloc]init];
    p1.language = java;
}

添加了协变

// __covariant 子类转父类;泛型名字是ObjectType
@interface Person<__covariant ObjectType> : NSObject

// 语言
@property (nonatomic, strong) ObjectType language;

@end

// 子类转父类
- (void)covariant {

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

    // iOS 只会iOS
    Person<Objective_C *> *p = [[Person alloc]init];
    p.language = ios;

    // Language 都会
    Person<Language *> *p1 = [[Person alloc]init];
    p1 = p;

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

添加了逆变

// __contravariant 可以逆变,父类转子类   泛型名字是ObjectType
@interface Person<__contravariant ObjectType> : NSObject

// 语言
@property (nonatomic, strong) ObjectType language;

@end

- (void)contravariant {

    // 第二步 定义泛型
    Objective_C *ios = [[Objective_C alloc]init];
    Language *language = [[Language alloc]init];

    // 父类转子类  都会
    Person<Language *> *p = [[Person alloc]init];
    p.language = language;

    // iOS  只会iOS
    Person<Objective_C *> *p1 = [[Person alloc]init];
    p1 = p;  

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

相关文章

  • iOS 泛型 ObjectType 协变 __covariant

    泛型使用场景: 在集合(数组、字典、NSSet)中使用泛型比较常见。 当声明一个类,类里面的某些属性的类型不确定,...

  • [iOS] 泛型ObjectType 协变__covariant

    一.泛型作用 二.泛型用法: 1.泛型声明:在声明类的时候,在类的后面<泛型名称> 2.使用泛型 类型<限制类型>...

  • iOS 泛型 ObjectType 协变 __covariant

    泛型使用场景: 在集合(数组、字典、NSSet)中使用泛型比较常见。 当声明一个类,类里面的某些属性的类型不确定,...

  • iOS 泛型 ObjectType 协变 __covariant

    泛型使用场景: 在集合(数组、字典、NSSet)中使用泛型比较常见。当声明一个类,类里面的某些属性的类型不确定,这...

  • Kotlin 泛型中的 in 和 out

    协变 在 Java 的泛型系统中. 泛型默认是不支持协变(covariant). 也就是说在 Java 中. 即使...

  • 泛型编程中的型变

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

  • iOS9新特性之泛型 和__kindof

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

  • Scala 泛型协变与泛型边界

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

  • OC中的ObjectType是什么类型

    ObjectType是Objective-C中的泛型 ObjectType的使用 自定义泛型只能在 @interf...

  • 第二十八条:列表优先数组

    数组与泛型相比,有两个重要的不同点。首先,数组是协变的(covariant)。这个词听起来有点吓人,其实只是表示如...

网友评论

      本文标题:iOS 泛型 ObjectType 协变 __covariant

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