Kotlin 具体化了参数化类型的问题

标签 kotlin jackson

为什么以下不起作用? 似乎 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/

相关文章:

android-studio - 安卓工作室 "Scanning For Files To Index"

java - Android 蓝牙 IOException : read failed, 套接字可能关闭或超时,读取 ret:-1

javascript - 如何在 Android 中使用 Duktape 访问 Javascript 模块

java - 如何处理一对一的json循环?

java - 寻找一种解析多类型 JSON 字段的方法

android - 数据类中的参数可以是 Kotlin 中的 var 吗?

android - 从另一个类(class)更改一个 Activity 中 “AutoCompleteTextView”的值

java - 无法从 START_ARRAY token 中反序列化 java.lang.String 的实例

java - 在 Jackson 中使用 ObjectMapper 时验证 JsonProperty 中设置的 (required=true) 应该抛出异常

java - 忽略所有属性但列出的属性的 Jackson 字段注释