【问题标题】:Scala type inference not working with play jsonScala 类型推断不适用于 play json
【发布时间】:2020-07-20 16:08:46
【问题描述】:

我正在编写一个 http 客户端,这是我的签名:

def post[Req, Resp](json: Req)(implicit r: Reads[Resp], w: Writes[Req]): Future[Resp]

在幕后使用 play json。

当我这样使用它时

def create(req: ClusterCreateRequest): Future[ClusterCreateResponse] = endpoint.post(req)

我收到以下错误

diverging implicit expansion for type play.api.libs.json.Reads[Resp]

以下作品

def create(req: ClusterCreateRequest): Future[ClusterCreateResponse] = endpoint.post[ClusterCreateRequest, ClusterCreateResponse](req)

为什么类型推断没有按预期工作?我可以为此做些什么?

【问题讨论】:

  • 您是否尝试过在create 签名中添加(implicit r: Reads[Resp], w: Writes[Req]) 是否适合您的情况?
  • 可能没有显式类型参数,某些类型被推断为Nothing。并尝试为 Nothing 解析类型类的实例会导致“发散隐式扩展”。

标签: scala playframework type-inference implicit


【解决方案1】:

diverging implicit expansion for type play.api.libs.json.Reads[Resp] 意味着 Resp 有很少的 JSON 序列化器不会被另一个遮蔽。

不可能查明问题的根本原因并说修复X 并且一切都会根据帖子中给出的信息进行。

但您可以尝试“调试”隐式搜索。考虑检查隐式搜索顺序: Where does Scala look for implicits? 在想法中启用隐式参数扩展可能有助于检查哪些隐式(Ctrl+Shift+=)导致冲突。

对类型类实例的一般建议 - 组织和声明它们,将它们放在伴随对象或专门的对象中。

【讨论】:

  • "diverging implicit expansion for type play.api.libs.json.Reads[Resp] 表示 Resp 的 JSON 序列化程序很少,不会被另一个隐藏。" 我想这是不正确的。序列化程序很少会导致“模糊隐含值”错误,而不是“发散隐式扩展”错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 2014-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多