objective-c - 泛型:初始化“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 被调用的任何内容)。我没有添加或创建任何东西,只是收到泛型错误的编译器警告。
解决方案
的泛型参数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 *> *
。
推荐阅读
- sql - Oracle 12c 中的 FLASHBACK_TRANSACTION_QUERY 视图不返回任何行
- c - 如何构建 sqlcipher?
- c# - 使自动按键注册像真正的键盘按键 C#(和或 C++)
- android - Android - Firebase 实时数据库中的复杂查询
- r - R中的CGlur的数据树:递归循环查找所有子节点直到叶子
- python - 绘制 Scipy optimize.minimize 每次迭代的收敛结果?
- python - How to configure Ansible for Python virtual environment?
- c# - 努力理解我的导师为我编写的代码,用于 arknoid/brickbreaker 碰撞检测
- javascript - 如何根据输入的json动态加载html元素?
- javascript - writeStream 完成后如何做某事?