使类类型通用后,无法在response.body()中获取值

时间:2018-08-08 12:09:43

标签: android generics kotlin retrofit

我正在尝试使用改造从服务器获取数据。我使用了泛型,因为我不想在项目中使用重复的代码。但是,当类型为T时,我无法在响应主体内部获取值。仅当我专门编写服务器响应的类名时,才能访问它。

这是我的代码:

 private fun <T> requestFun(call: Call<T>, default: T) {

                call.enqueue(object : Callback<T> {
                    override fun onResponse(call: Call<T>, response: Response<T>) {
                        response.body()
                    }

                    override fun onFailure(call: Call<T>?, t: Throwable) {

                    }
                })

            }

这是我的模特

data class JsonResponse<T>(
    var data: List<T>? = null,
    var success: Boolean = true)

我希望能够使用response.body.result取回数据列表。但是,这不起作用,因为在函数中我将类型设为通用类型,而不是JsonResponse!

1 个答案:

答案 0 :(得分:0)

您可能应该这样使用它:

 private fun <T> requestFun(call: Call<T>, onSuccess: (T) -> Unit) {
     call.enqueue(object : Callback<T> {
         override fun onResponse(call: Call<T>, response: Response<T>) {
             onSuccess(response.body())
         }

         override fun onFailure(call: Call<T>?, t: Throwable) {

         }
     })

那你可以做

 requestFun<MyClass>(myCall) { myClass: MyClass ->
      ...
 }

当然,这没有任何错误处理,但这是有可能的。


在您的情况下,您实际上并未收到T,而是出于未知原因收到了JsonResponse<T>,因此您可以这样做:

 private fun <T> requestFun(call: Call<JsonResponse<T>>, onSuccess: (List<T>) -> Unit) {
    call.enqueue(object : Callback<JsonResponse<T>> {
         override fun onResponse(call: Call<JsonResponse<T>>, response: Response<JsonResponse<T>>) {
             val body = response.body()
             onSuccess(body.data ?: Collections.emptyList())
         }

         override fun onFailure(call: Call<JsonResponse<T>>?, t: Throwable) {

         }
    });
 }