首页 > 解决方案 > 为什么 java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap 不能转换为 com.readbook.chinesepoetry.data.model.Response?

问题描述

我是 kotlin Android 开发者的初学者。我遇到了这个问题,我不知道如何解决它。

我定义了一个 kotlin 扩展函数Observable<T>.toTraditional()以保持 Rx 流调用,但我遇到了一个异常。

这是我的代码:

class Test {
    @Test
    fun test() {
        val json = "{\"result\":{\"curPage\":1,\"data\":[{\"id\":1,\"name\":\"关雎\",\"dynasty\":\"先秦\",\"poet\":\"佚名\",\"content\":\"钟鼓乐之。\"},{\"id\":1213,\"name\":\"伐檀\",\"dynasty\":\"先秦\",\"poet\":\"佚名\",\"content\":\"钟鼓乐之。\"}],\"pageCount\":388,\"size\":20,\"total\":7756},\"status\":1,\"message\":\"成功\"}"
        Observable.create<Response<RecommendListBean>> {
            val response = getResponse<Response<RecommendListBean>>(json)
            it.onNext(response)
        }.toTraditional().subscribe({},{
            println(it)
        })
    }

    inline fun <reified T> getResponse(json: String): T {
        return fromJson(json)
    }

    inline fun <reified T> Observable<T>.toTraditional(): Observable<T> {
        return map {
            val toJson = Gson().toJson(it)
            // In fact, I convert simplified chinese in json to traditional chinese.
            // Here, I intentionally omit that code to make my problem more clearly.
            val result = fromJson<T>(toJson)
            result
        }
    }

    inline fun <reified T> fromJson(json: String?): T {
        return Gson().fromJson<T>(json, object : TypeToken<T>() {}.type)
    }
}

另外,我需要提供我的三个 bean:

data class Response<T>(
        val message: String,
        @SerializedName(value = "result", alternate = ["data"])
        val result: T,
        val status: Int
)
data class RecommendListBean(
        val curPage: Int,
        val data: List<PoetryBean>,
        val pageCount: Int,
        val size: Int,
        val total: Int
)
data class PoetryBean (
    val content: String,
    val dynasty: String,
    val id: Int,
    val name: String,
    val poet: String
)

运行上面的代码后,我得到了错误:

java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为 com.readbook.chinesepoetry.data.model.Response

我在网上查过这个异常,很多人说是因为 kotlin 泛型擦除。但是,我检查了我的代码,它们确实有reified关键字。

标签: javaandroidkotlin

解决方案


fun <R :Any> Observable<R>.toTraditional(): Observable<R> {
return map {
    val toJson = Gson().toJson(it)
    // In fact, I convert simplified chinese in json to traditional chinese.
    // Here, I intentionally omit that code to make my problem more clearly.
    val result = Gson().fromJson<R>(toJson,it.javaClass)
    result
  }
}

只需获取对象的类


推荐阅读