泛型类的类型化数组

考虑以下简化的协议/类层次结构

protocol P {
}

class A: P {
}

class B: P {
}

class C<T: P> {
}

我想创建该类实例的类型化数组C但是,自动类型推断似乎不起作用。当我做

let objs = [C<A>(), C<B>()]
let obj = objs[0]

objsobj是类型[AnyObject]AnyObject分别。我本来希望像

let objs:[C<P>] = [C<A>(), C<B>()]

工作,但它不会与错误编译

Using 'P' as a concrete type conforming to protocol 'P' is not supported

这样就完全省略了通用类型

let objs:[C] = [C<A>(), C<B>()]

在编译时产生不同的错误

Cannot convert value of type 'NSArray' to specified type '[C]'

有什么办法可以创建C类型比特定实例数组[AnyObject]

林太郎

考虑以下代码:

// DOES NOT WORK!!

protocol P {
    var name: String { get }
}

class A: P {
    var name = "A"
}

class B: P {
    var name = "B"
}

class C<T: P> {
    var val: T
    init(val: T) {
        self.val = val
    }
}

let objs: [C<P>] = [ C<A>(A()) ]

let firstObj: C<P> = obj[0]
firstObj.val = B()

在这种情况下,firstObj实际上是一个C<A>实例。firstObj.val必须接受,B()因为firstObj.val受限制PB符合P你知道这是非法的。这就是为什么您不能投射C<A>C<P>

要解决此问题,例如,您可以在周围创建一些包装器C

protocol P {
    var name: String { get }
}

class A: P {
    var name = "A"
}

class B: P {
    var name = "B"
}

class C<T: P> {
    var val: T
    init(_ val: T) {
        self.val = val
    }
}

/// Type erasing wrapper around C that has accessor for `C.val`
struct AnyC {

    let _val: () -> P
    var val: P { return _val() }

    init<T>(_ c: C<T>) {
        _val = { return c.val }
    }
}

let objs:[AnyC] = [
    AnyC( C<A>(A()) ),
    AnyC( C<B>(B()) ),
]
objs[0].val.name // -> "A"
objs[1].val.name // -> "B"

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

实例化泛型类的JAVA数组

来自分类Dev

如何从字段类型正确实例化泛型类并将其放入数组中

来自分类Dev

Java泛型:如何为泛型类型化的类指定类类型?

来自分类Dev

Java泛型:如何为泛型类型化的类指定类类型?

来自分类Dev

Java泛型-参数化的类与类型化方法

来自分类Dev

Spring 4泛型类,获取参数化类型

来自分类Dev

Scala从泛型类型实例化具体类

来自分类Dev

Java-实例化泛型类型的类

来自分类Dev

MongoDb序列化泛型类型(类)

来自分类Dev

在Typescript中的泛型类中初始化泛型类型

来自分类Dev

从泛型类返回数组

来自分类Dev

实例化泛型类型

来自分类Dev

实例化泛型类型

来自分类Dev

在泛型类型的泛型类上访问类型参数

来自分类Dev

如何使用泛型返回泛型类的类类型?

来自分类Dev

访问类型是泛型类的子类型?

来自分类Dev

泛型类型类的正确类型提示

来自分类Dev

在泛型类中实例化 Java 泛型类

来自分类Dev

如何为泛型类指定泛型集合类型?

来自分类Dev

泛型-使用父类在泛型中指定类型

来自分类Dev

泛型方法和泛型类中的类型推断

来自分类Dev

Swift:在泛型类中比较泛型类型

来自分类Dev

Swift:在泛型类中比较泛型类型

来自分类Dev

C#如何使用类型为“类型”的对象初始化泛型类

来自分类Dev

C#如何使用类型为“类型”的对象初始化泛型类

来自分类Dev

您可以使用特定的类型化类来继承泛型类吗?

来自分类Dev

泛型方法类型不能用作泛型类的泛型类型

来自分类Dev

Java泛型通配符与类型化泛型用法

来自分类Dev

在泛型类中使用匿名类型