我有一个关于 Swift 泛型的快速问题。问题是我试图存储一个以泛型作为参数的变量,但无法将其转换为它所限制的类型。最好用一个简短的例子来解释:
class Foo { }
class Thing<T: Foo> {
func produceBar() -> Bar {
return Bar(aThing: self as! Thing<Foo>)
}
}
class Bar {
var thing: Thing<Foo>
init(var aThing: Thing<Foo>) {
self.thing = aThing
}
}
上面的代码产生错误:"Cast from Thing<T> to unrelated type Thing<Foo> always fails"
难道不应该吗never失败,因为 T 被限制为 Foo 的子类?我一定是误解了泛型在 Swift 中的工作方式,任何指导或帮助将不胜感激!
Swift 泛型不是协变的。也就是说,正是错误所说的:你不能自动说Basket<Apple>
是一种Basket<Fruit>
即使Apple
是一种Fruit
。这是有充分理由的。
考虑以下代码:
class Fruit {}
class Apple: Fruit {}
class Orange: Fruit {}
class Basket<T: Fruit> {
private var items: [T]
func add(item: T) {
items.append(item)
}
init() {}
}
func addItem<T: Fruit>(var basket: Basket<T>, item: T) {
basket.add(item)
}
let basket:Basket<Apple> = Basket()
addItem(basket as Basket<Fruit>, Orange())
这将是合法的代码,如果Basket<Apple>
被认为是Basket<Fruit>
,并且我可以在一篮子苹果中添加一个橙子。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)