在Swift中,如果我声明一个基于泛型的类:
class BasicRequest<T>{
}
class StartRequest: BasicRequest<BasicPayload> {
}
然后尝试使用通用方法:
class SocketClient {
public func send(request: BasicRequest<Any>){
}
}
它不能编译:
SocketClient.shared.send(request: StartRequest())
有消息
无法将类型“ StartRequest”的值转换为预期参数 输入“ BasicRequest”
为什么呢?类型信息应该在整个继承链中都可用。
答案 0 :(得分:2)
在Swift中泛型是不变的,在您的情况下,这意味着BasicRequest<Any>
与BasicRequest<BasicPayload>
不兼容,即使BasicPayload
与Any
也不兼容。这就是不变式的工作方式,在这个方向上您几乎无能为力。
您可以做的是使send
通用,从而允许传递任何种类的BasicRequest
实例:
public func send<T>(request: BasicRequest<T>){
}