*' 带有 'NSMutableArray<__kindof superclass *> * 类型的表达式,objective-c,generics"/>

首页 > 解决方案 > 泛型:初始化“NSMutableArray”的指针类型不兼容*' 带有 'NSMutableArray<__kindof superclass *> * 类型的表达式

问题描述

我有这个属性:

@property (nonatomic) NSMutableArray <__kindof superclass*> *items;

我用子类的对象填充它(由于 __kindof 应该没问题)。我像这样检索数组:

NSMutableArray <__kindof subclass*> *items = holderObject.items;

但是现在我收到了这个编译器警告:

Incompatible pointer types initializing 'NSMutableArray<subclass *> *' with an expression of type 'NSMutableArray<__kindof superclass *> * _Nullable'

这不就是 __kindof 应该为我们做的吗?我在这里做错了什么?

更新 2:这只发生在可变数组上。

更新:这是一些显示警告的简单代码:

创建一个新类GenericsError.h:

@import UIKit;
@interface GenericsError : NSObject
@property (nonatomic) NSMutableArray <__kindof UIViewController*> *generics;
@end

在任何 viewController 中只需添加:

GenericsError *error = [GenericsError new];
NSMutableArray <ViewController*>* controllers = error.generics;

(用 ViewController 代替您的 viewController 被调用的任何内容)。我没有添加或创建任何东西,只是收到泛型错误的编译器警告。

标签: objective-cgenerics

解决方案


的泛型参数NSMutableArray是不变的(它是声明的@interface NSMutableArray<ObjectType>而不是@interface NSMutableArray<__covariant ObjectType>or @interface NSMutableArray<__contravariant ObjectType>)。这意味着类型参数必须完全匹配才能兼容。

这意味着NSMutableArray<NSString *> *不能分配给NSMutableArray<NSObject *> *,反之亦然,即使NSString *可以分配给NSObject *。(另一方面, 的类型参数NSArray是协变的(声明为NSArray<__covariant ObjectType>),这意味着NSArray<NSString *> * 可以分配给NSArray<NSObject *> *。)

NSMutableArray<NSString *> *甚至不能分配给NSMutableArray<id> *,反之亦然,即使NSString *可以分配给id并且id可以分配给NSString *,在两个方向上。我猜这个想法是id关闭静态类型检查,但仅适用于实际类型的使用id,而不适用于id具有类型参数的类型。

__kindof superclass *是一种“受限”版本id——它关闭静态类型检查,但仅在分配给和来自superclass *. 出于同样的原因,NSMutableArray<id> *不能分配给或来自NSMutableArray<someclass *> *上面,NSMutableArray<__kindof superclass *> *也不能分配给或来自NSMutableArray<subclass *> *


推荐阅读