代码之家  ›  专栏  ›  技术社区  ›  Olof_t

泛型:初始化“NSMutableArray<subclass*>*”的指针类型不兼容,表达式类型为“NSMutableArray<\uukindof superclass*>*

  •  2
  • Olof_t  · 技术社区  · 7 年前

    我有这个财产:

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

    我用子类的对象填充它(这应该是可以的,因为uu kindof)。我像这样检索数组:

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

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

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

    更新2: 只有可变数组才会发生这种情况。

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

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

    在任何viewController中,只需添加:

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

    (将ViewController替换为ViewController调用的内容)。我没有添加或创建任何东西,只是得到了泛型错误的编译器警告。

    2 回复  |  直到 7 年前
        1
  •  1
  •   newacct    7 年前

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

    这意味着 NSMutableArray<NSString *> * 无法分配给 NSMutableArray<NSObject *> * NSString * 可以分配给 NSObject * . (另一方面,类型参数 NSArray NSArray<__covariant ObjectType> ),也就是说 NSArray<NSString *> * 可以 NSArray<NSObject *> * .)

    NSMutableArray<NSString*>* 甚至不能分配给 NSMutableArray<id> * ,反之亦然 可以分配给 id 身份证件 NSString公司* ,两个方向。我想是这样的 身份证件 关闭静态类型检查,但仅限于使用实际类型 身份证件 ,而不是 身份证件 作为类型参数。

    __kindof superclass * 身份证件 --它将关闭静态类型检查,但仅当为 superclass * . 因为同样的原因 NSMutableArray<id>* NSMutableArray<someclass *> * 上面, NSMutableArray<__kindof superclass *> * NSMutableArray<subclass *> * .

        2
  •  -1
  •   Daniele Pantaleone    7 年前

    你有遗产 (其中 B 是超类),您声明了一个容器来保存 B 在容器里。不能保证 B 也是 .

    想象一下有另一节课 C->B (其中 C ,和 B 是上面提到的同一个超类)。在这种情况下 C __有点 __有点 A

    长话短说:你需要使用 声明容器时,取消警告。