对this question进行修补,我提出了这个问题:
class AllTogether<T: FooProtocol> {
func createContainer<U: T>(data: U){
Container<T>(someDataConformingFooProtocol: data)
}
}
我的理解是,如果我们使FooProtocol
成为一个类协议,这应该有效:
protocol FooProtocol: class { ... }
但是,我们仍然会遇到错误:
Error: inheritance from non-protocol, non-class type 'T'
Error: argument type 'U' does not conform to expected type 'FooProtocol'
这两条消息似乎都是错误的。我错过了什么?
子类型关系在Swift中不可传递吗?
答案 0 :(得分:0)
该函数添加了一个不必要的附加关系。
Container希望使用类型为T的对象进行初始化。
如果U是T的子类,那么任何可以用
调用的东西func createContainer<U: T>(data: U)
也可以用
调用func createContainer(data: T)
基本上,函数正在做什么似乎应该是可能的(并且可能在某些时候.Swift的泛型是由于要进行彻底改进/改进)但无论如何它都是毫无意义的。
请改用:
func createContainer(data: T){
Container<T>(someDataConformingFooProtocol: data)
}