java - 为什么 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
关键字。
解决方案
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
}
}
只需获取对象的类
推荐阅读
- python - 为什么数字和数据框标题之间有零?
- javascript - for循环中的setTimeout不返回预期结果
- azure - 如何确定要与 Azure 表单识别器服务一起使用的 Azure 训练模型。可以在同一个模型中训练多个布局吗?
- javascript - 有没有办法将当前渲染的角度页面连同所有 JS 功能一起导出到静态 HTML?
- html - 如何隐藏空的下拉引导程序
- html - 如何使用 Excel Visual Basic 单击节点树中的元素
- spring-boot - 在 InelliJ 中将现有项目转换为 Spring Boot 项目
- c++ - 我收到类中每个方法的“重新定义”错误
- javascript - 如何创建一个使用给定标签名称创建新 HTML 元素并具有操作它的方法的 ES6 类?
- javascript - 简单 CSS 下拉菜单中的紫色链接