【问题标题】:How to send a type parameter as a function argument如何将类型参数作为函数参数发送
【发布时间】:2020-11-28 06:39:11
【问题描述】:

我发现自己反复使用一段类似的代码进行 JSON 解组。 sn-ps 之间的唯一区别是函数调用中的类型参数。因此,我尝试编写一个函数来提高代码重用性,但我似乎无法编译它。我正在尝试做的事情如下所示。

/** Decode a GET response by unmarshalling its JSON payload.
 * @tparam R The type of Response to unmarshall into.
 * @param response The GET response to decode.
 * @return Try[R] if decoding was successful, else Failure[Throwable] */
private def decodeResponse[R <: Response](response: HttpResponse): Try[R] = {
  val payload = decode[R](response.text)
  logger.debug(s"Decoded payload: $payload")
  payload.toTry
}

如您所见,我希望指定一个类型 R 作为我的返回类型和函数体的一部分。我相信是后者导致编译失败,但我不确定如何修复它。 R 的一个示例是 SearchResponse,它扩展了 Response 特征的案例类定义。

我对类型参数进行了多次搜索,但没有结果使用函数体中的类型参数。此外,我搜索了编译时抛出的异常:

Error:(72, 28) could not find implicit value for evidence parameter of type io.circe.Decoder[R]
    val payload = decode[R](response.text)

但是,所有结果都会导致针对导致这些问题的特定库的解决方案,不幸的是,这对我没有用处。任何帮助将不胜感激!

【问题讨论】:

  • [R &lt;: Response : Decoder]
  • 谢谢你,完美!有什么线索可以让我找到更多相关信息吗?

标签: scala implicit circe


【解决方案1】:

decode[R] 函数需要Decoder[R] 类型的隐式参数。要使您的代码编译,您需要将此隐式参数添加到您自己的函数中:

private def decodeResponse[R <: Response](response: HttpResponse)(implicit decoder: Decoder[R]): Try[R] = …

为某些类型参数A 传递一个隐式参数Foo[A] 是一种非常常见的情况,这就是为什么他们为这个用例提出了一种更简洁的语法:上下文边界。 https://docs.scala-lang.org/tutorials/FAQ/context-bounds.html 这意味着当你写这个时

def foo[A: Foo] = …

这将等同于:

def foo[A](implicit f: Foo[A])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多