首页 > 解决方案 > 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')

标签: kotlinjackson

解决方案


这种情况下的问题是您没有指定 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
}

推荐阅读