Kotlin和GSON遇到的泛型问题

时间:2018-04-04 08:43:20

标签: android kotlin gson

我尝试编写一个网络请求函数,它的作用是分析一般格式并为回调提供数据内容。

这是我定义的类:

data class Response<T>(
    val code: Int = 0,
    @JvmSuppressWildcards
    var data: ArrayList<T>,
    val message: String = "")

在本课程中的代码&#39;和&#39;消息&#39;是固定的,数据&#39;有不同的类型

选择一个数据:

data class TestData(
    @SerializedName("create_by")
    val createBy: String = "",
    @SerializedName("create_time")
    val createTime: String = "",
    @SerializedName("name")
    val name: String = "",
    @SerializedName("id")
    val id: String = "")

有我的网络请求功能:

fun <T> post(callBack: (ArrayList<T>) -> Unit) {
    ...
     override fun onSuccess(response:Response<String>) {
          val result = gson.fromJson<Response<T>>(response.body().reader(),Response::class.java)
          when{
              result.code==200-> callBack.invoke(result.data)
          }
     }
    ...
}

在活动中使用它:

Request.addr(Constants.GET_TEST)
       .post<TestData> {
            tv.text = it[0].name
        }

当我使用Gson解析服务器返回数据时,想要使用JavaBean,Logcat抛出此异常:

  

java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap无法强制转换为com.example.network.response.TestData

我尝试使用TypeToken来解决这个问题,但它也不起作用。

1 个答案:

答案 0 :(得分:0)

这会导致,因为解析器无法在运行时获取实际类型T. 这个扩展适用于我

内联乐趣Gson.fromJson(json:String)=         this.fromJson(json,object:TypeToken(){} .type)!!

然后您需要像IDE推荐的那样修改方法。