gpt4 book ai didi

kotlin - 将 Fuel 的 responseObject 与通用调用站点一起使用

转载 作者:行者123 更新时间:2023-12-02 12:48:20 27 4
gpt4 key购买 nike

我在使用 Fuel 的 responseObject 时遇到问题以一般的方式。我正在尝试开发一种集中式方法,其中组件的 HTTP 响应对象已经反序列化,准备就绪。它看起来像这样:

class Controller(private val url: String) {
fun <T> call(endpoint: String): T {
return "$url/$endpoint".httpGet().responseObject<T>()
}
}
class App(private val controller: Controller) {
fun getModel() {
val model = controller.call<AppModel>("model")
// use model
}
}

当然, Controller.call将处理错误,并添加常见的请求参数。 JSON 的反序列化应该由 Jackson 处理( AppModel 是 Jackson 应该自动获取的简单数据类),所以我正在使用 fuel-jackson:1.12.0作为附加的依赖项。

现在,使用 Kotlin-1.2.21,我得到了这个编译器错误:

Error:(35, 97) Kotlin: Cannot use 'T' as reified type parameter. Use a class instead.



我该如何解决这个问题,也许通过切换到不同的燃料方法?

我考虑过制作 call内联(具体化 T),但这违背了拥有 private val url 的目的.

最佳答案

我认为这个问题没有简单的解决方法。

首先,如果不使用具体类型或通过对内联函数的泛型调用链传播类型参数,就无法调用具有具体类型参数的 Kotlin 内联函数,因此您必须调用 .httpGet().responseObject<T>()来自内联函数并使用具体类型参数作为 T .

接下来,限制内联函数可以访问的内容是有原因的。基本上,允许内联函数访问非公共(public) API 有时会破坏二进制兼容性。这在文档 here 中有描述。 .

您可以做的是,如文档中所建议的,制作 private val url: String一个 @PublishedApi internal val并相应地继续 inline fun <reified T> call(...) .

如果您担心url成为有效的公众,你可能想看看这个Q&A建议使用 @JvmSynthetic 的解决方法.

关于kotlin - 将 Fuel 的 responseObject 与通用调用站点一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48585651/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com