kotlin - Kotlin 用参数化类型具体化了问题
问题描述
为什么以下不起作用?似乎 Foo 类型没有正确传递,或者这只是一个众所周知的“问题”?
Foo<T>
失败
data class Foo<T>(val a: T)
data class Bar(val b: String)
val objectMapper = ObjectMapper().registerKotlinModule()
val jsonString = "{\"a\": { \"b\": \"str\" }}"
fun main() {
val parseJson = parseJson<Bar>()
}
private inline fun <reified T> parseJson(): T {
val readValue: Foo<T> = objectMapper.readValue(jsonString)
return readValue.a
}
class java.util.LinkedHashMap cannot be cast to class ..Bar
(java.util.LinkedHashMap is in module java.base of loader 'bootstrap';
..Bar is in unnamed module of loader 'app')
解决方案
这种情况下的问题是您没有指定 ObjectMapper 应该尝试将您映射jsonString
到的类。Foo
由于类型是参数化的,事情变得更加复杂。
您需要构建一个JavaType
引用以传递给objectMapper.readValue
.
private inline fun <reified T> parseJson(): T {
val javaType = objectMapper.typeFactory.constructParametricType(Foo::class.java, T::class.java)
val readValue: Foo<T> = objectMapper.readValue(jsonString, javaType)
return readValue.a
}
推荐阅读
- firefox - 处理权限时出错。2:读取附加清单时 Firefox 中的值“背景”
- ruby-on-rails - 可以加入 Rails 动作文本模型
- android - RecyclerView 严重滞后,列表很大
- sql - 使用 sum 和 group by 条件将 SQL 查询转换为 linq/lambda 表达式
- c# - WPF TextBlock 不换行
- javascript - 文本框中波斯文本的正确格式
- javascript - 如何在 clip() 之后在画布中执行 clearRect()?
- sqoop - 错误 tool.ImportTool:导入失败:java.io.IOException:无法加载 jar /tmp/sqoop-root/
- c - c中strstr的复杂度是多少?
- vb.net - 文本框的 Isnumberic 但文本框接受字母