iOS 泛型 ObjectType 协变 __covariant

2021-06-07  本文已影响0人  hui8685291

泛型使用场景:

NSMutableArray<UITouch *> *datas

泛型好处:

纯白的讲:

例如:

// __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;  

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

上一篇 下一篇

猜你喜欢

热点阅读