【发布时间】:2020-07-23 19:51:00
【问题描述】:
多年来,我一直在使用 Jackson 序列化/反序列化对象,并且一直发现使用 TypeReference<T> 反序列化 List 等不必要地复杂。我创建了一个简单的辅助函数:
public static <T> TypeReference<List<T>> list() {
return new TypeReference<List<T>>(){}
}
按预期用途:
List<Foo> foos = objectMapper.readValue(json, list());
而且它有效!的种类。通过调试器检查时,而不是Foo 的列表,而是LinkedHashMap 的列表。我知道ObjectMapper 反序列化为LinkedHashMap 类型为Object,我在这里阅读了解释:
Jackson and generic type reference
但是,为什么它能够将List<LinkedHasMap> 分配给List<Foo>?至少不应该是某种ClassCastException?
另外,有没有办法用 Java 的类型系统做到这一点?
注意:以下方法声明具有相同的问题,这是有道理的,因为确定 T 不需要额外的参数:
public static <T> TypeReference<List<T>> listOf(Class<T> ignored) {
return new TypeReference<List<T>>(){}
}
【问题讨论】:
-
这能回答你的问题吗? Jackson and generic type reference
-
List<LinkedHasMap>和List<Foo>在运行时没有区别,因为类型擦除。 -
另见Gson deserialize list and class, how does erasure work here?不同的库,完全相同的问题。
标签: java list class jackson type-erasure