在Swift中考虑以下内容:
struct GenericStruct<T> {}
class A {}
class B: A {}
func doSomething() -> GenericStruct<A> {
return GenericStruct<B>()
}
Run Code Online (Sandbox Code Playgroud)
这给出了错误:
无法将返回表达式转换
GenericStruct<B>为返回类型GenericStruct<A>
但是B是它的子类A.
GenericStruct<B>为GenericStruct<A>?Swift泛型是不变的,这意味着两个泛型类型是无关的,即使它们的泛型类型参数具有继承关系.不变的泛型类型不能彼此强制转换,因为它们彼此之间没有继承关系.
这意味着,GenericStruct<B>和GenericStruct<A>是即使完全无关的B是一个子类A,因此你不能施放一个到另一个.
这是一个反例,说明如果允许这样做会发生什么:
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?
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
230 次 |
| 最近记录: |