kotlin - Jackson convertValue() 不适用于 Kotlin 中的具体类型参数
问题描述
我希望这会返回一个Money
对象列表,但它会返回LinkedHashMap
,这是我猜的通用后备类型。似乎具体化的类型参数没有被传播,即使它应该传播。
这是一个独立的示例(依赖项:assertj、junit、jackson-databind、kotlin-1.4.32):
import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module
import com.fasterxml.jackson.module.kotlin.KotlinModule
import com.fasterxml.jackson.module.kotlin.convertValue
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
class MapperTest {
val JSON_MAPPER = ObjectMapper().apply {
registerModule(KotlinModule())
registerModule(Jdk8Module())
}
data class Money(@JsonProperty("Currency") val currency: String?)
@Test
fun testMapper() {
val map = listOf(mapOf("Currency" to "EUR"))
assertThat(fromMap(map)[0]).isInstanceOf(Money::class.java) // passes
assertThat(fromMapReified<Money>(map)[0]).isInstanceOf(Money::class.java) // fails
}
private fun fromMap(map: List<Map<String, String>>) : List<Money> {
return JSON_MAPPER.convertValue(map)
}
private inline fun <reified T> fromMapReified(map: List<Map<String, String>>) : List<T> {
return JSON_MAPPER.convertValue(map)
}
}
解决方案
推荐阅读
- java - 如何使用 Java ProcessBuilder API 运行交互式 bash?
- java - Java Eclipse 使用 mac Mojave 向上导出可运行的 .exe 文件
- laravel - Laravel错误尝试仅在部署时获取非对象的属性“日期”
- java - 以数组列表作为输入参数调用存储过程
- pyglet - 在 pyglet 项目中导入 numba 模块时出错
- android - 使用 SAF 删除选取的图像
- c - 将 memset() 设置为零时初始化为静态结构定义是什么意思?
- python - 使用正则表达式仅获取以字母或数字开头和结尾的单词
- android - 使用 FlutterActivity 时如何将数据从 java 模块传输到 Flutter?
- javascript - 按下Javascript中的按钮后如何重新聚焦在文本字段中的位置?