使用Fuel的responseObject与一个通用调用站点

我用通用的方式使用Fuel的responseObject有一个问题。 我试图开发一个集中的方法,让组件获得他们的HTTP响应对象已经反序列化,准备去。 它看起来像这样:

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

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

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

错误:(35,97)Kotlin:不能使用“T”作为实体types参数。 改用class级。

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

我已经考虑过在内部call (用来表示T),但是这个失败的目的是拥有一个private val url

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

首先,无法使用具体types参数调用Kotlin内联函数,而无需使用具体types或通过对内联函数的generics调用链传播types参数,因此您必须调用.httpGet().responseObject()从一个内联函数中使用一个指定的types参数作为T

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

你可以做的是,正如文档中建议,使private val url: String a @PublishedApi internal val并相应地,继续与inline fun call(...)

如果您担心url被公开发布,您可能需要查看此问题解决方案,并提供@JvmSynthetic的解决方法。