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

为什么swift不能自动将泛型类型参数转换为它的超类?[复制品]

  •  3
  • funkybro  · 技术社区  · 8 年前

    请迅速考虑以下事项:

    struct GenericStruct<T> {}
    class A {}
    class B: A {}
    
    func doSomething() -> GenericStruct<A> {
       return GenericStruct<B>()
    }
    

    这会产生错误:

    无法转换类型的返回表达式 GenericStruct<B> 返回类型 GenericStruct<A>

    但是 B A .

    • 为什么斯威夫特不能皈依 一般结构<b> 一般结构<a> ?
    • 在这种情况下应该怎么做?
    2 回复  |  直到 8 年前
        1
  •  9
  •   Dávid Pásztor    8 年前

    swift泛型是 不变量 ,这意味着即使两个泛型类型的泛型类型参数具有继承关系,它们也是不相关的。不变泛型类型不能相互转换,因为它们彼此没有继承关系。

    这意味着 GenericStruct<B> GenericStruct<A> 完全无关,即使 B A ,因此不能将一个对象投射到另一个对象。

        2
  •  8
  •   Alexander    8 年前

    下面是一个反例,说明如果允许,会发生什么情况:

    struct GenericStruct<T> {
        let value: T
    }
    
    class A {}
    class B: A {}
    class C: A {}
    
    let wrapperOfB: GenericStruct<B> = GenericStruct(value: B())
    let wrapperOfA: GenericStruct<A> = wrapperOfB // Suppose GenericStruct<B> was a subtype of GenericStruct<A>
    wrapperOfA.value = C() // C is an A, so this should be legal
    
    useB(wrapperOfB.value) // Now what?