如何将类型参数作为函数参数发送
How to send a type parameter as a function argument
我发现自己反复使用一段类似的代码进行 JSON 解组。片段之间的唯一区别是函数调用中的类型参数。因此,我试图编写一个函数来提高代码的重用性,但我似乎无法编译它。我正在尝试做的事情如下所示。
/** 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
作为我的 return 类型的一部分和函数体的一部分。我相信是后者导致编译失败,但我不确定如何修复它。 R
的一个示例是 SearchResponse
,class 定义扩展了 Response
特征。
我对类型参数进行了多次搜索,但没有结果在函数体中使用类型参数。此外,我搜索了编译时抛出的异常:
Error:(72, 28) could not find implicit value for evidence parameter of type io.circe.Decoder[R]
val payload = decode[R](response.text)
但是,所有结果都针对导致这些问题的特定库提供了解决方案,不幸的是,这对我没有用。任何帮助将不胜感激!
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])
我发现自己反复使用一段类似的代码进行 JSON 解组。片段之间的唯一区别是函数调用中的类型参数。因此,我试图编写一个函数来提高代码的重用性,但我似乎无法编译它。我正在尝试做的事情如下所示。
/** 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
作为我的 return 类型的一部分和函数体的一部分。我相信是后者导致编译失败,但我不确定如何修复它。 R
的一个示例是 SearchResponse
,class 定义扩展了 Response
特征。
我对类型参数进行了多次搜索,但没有结果在函数体中使用类型参数。此外,我搜索了编译时抛出的异常:
Error:(72, 28) could not find implicit value for evidence parameter of type io.circe.Decoder[R]
val payload = decode[R](response.text)
但是,所有结果都针对导致这些问题的特定库提供了解决方案,不幸的是,这对我没有用。任何帮助将不胜感激!
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])