【问题标题】:Swift (4) cannot cast to generic base class?Swift (4) 不能转换为泛型基类?
【发布时间】:2018-09-18 11:21:46
【问题描述】:

在 Swift 中,如果我声明一个基于泛型类型的类:

class BasicRequest<T>{
}

class StartRequest: BasicRequest<BasicPayload> {
}

然后尝试使用泛型方法:

class SocketClient {

  public func send(request: BasicRequest<Any>){
  }
}

它不编译:

SocketClient.shared.send(request: StartRequest()) 

有消息

无法将“StartRequest”类型的值转换为预期参数 输入“基本请求”

为什么?类型信息应该在整个继承链中可用。

【问题讨论】:

  • 错误消息中的 ReconnectRequest/AbstractWebSocketMessage 在您的代码中没有定义。请发布真实代码/消息。
  • Any 与泛型无关。
  • 抱歉,文字已更正
  • 看起来像 Swift generic coercion misunderstanding 的副本:BasicRequest&lt;Any&gt;BasicRequest&lt;BasicPayload&gt; 是不同的、不相关的类型。
  • 反复出现的问题,泛型在 Swift 中是不变的,这就是你的代码不起作用的原因。

标签: swift generics swift4


【解决方案1】:

泛型在 Swift 中是不变的,这在您的情况下意味着 BasicRequest&lt;Any&gt;BasicRequest&lt;BasicPayload&gt; 不兼容,即使 BasicPayloadAny 兼容。这就是不变量的工作原理,您在这个方向上无能为力。

您可以做的是使send 通用,从而允许传递任何类型的BasicRequest 实例:

public func send<T>(request: BasicRequest<T>){
}

【讨论】:

    猜你喜欢
    • 2017-11-12
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    相关资源
    最近更新 更多