为什么以下不起作用? 似乎 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
}
关于Kotlin 具体化了参数化类型的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62071889/