java - 为什么 Jackson TypeReference 是抽象的?

标签 java jackson

为什么 Jackson 的 TypeReference 是抽象的?它通常会使用法变得更难看,因为您需要包含大括号来创建内联类(而且大多数 linters 会强制您在同一行中不要使用大括号)。

https://github.com/FasterXML/jackson-core/blob/master/src/main/java/com/fasterxml/jackson/core/type/TypeReference.java

new TypeReference<Map<String, String>>() {
};

这是由于某些晦涩的 Java 语言限制造成的吗?

最佳答案

JB Nizet 已经回答了原因。我只是想演示作用原理。

您可以在其他类(class)中自己尝试:

List<String> a = new ArrayList<String>();
List<String> b = new ArrayList<String>() {};

System.out.println(a.getClass().getGenericSuperclass());
System.out.println(b.getClass().getGenericSuperclass());

Ideone demo

输出:

java.util.AbstractList<E> 
java.util.ArrayList<java.lang.String>

如您所见,创建匿名子类会在运行时保留有关列表的具体泛型类型的类型信息。

A TypeReference做同样的事情:

new TypeReference<Map<String, String>>() { }

有一个通用父类(super class):

 TypeReference<java.util.Map<java.lang.String, java.lang.String>>

从这里,你可以得到类型 Map<String, String> .如果您为另一种类型创建了类型引用:

    new TypeReference<Map<Integer, Integer>>() { };

你可以得到类型 Map<Integer, Integer>> ,与 Map<String, String> 分开.

如果TypeReference是非抽象的,你可以这样写:

TypeReference<Map<String, String>> p = new TypeReference<>();
TypeReference<Map<Integer, Integer>> q = new TypeReference<>();

但是 p 的类型和 q将无法区分。

关于java - 为什么 Jackson TypeReference 是抽象的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57720769/

相关文章:

java - kotlin dagger改造现场注入(inject)

java - 使用 Jackson 将 JSONArray 转换为 Map

java - Android 应用程序解析 JSON 数据错误?

json - 从 JSON 文件中检索数组

java - 将 Java 字符串转换为 HashMap 对象

java - 如何解决此错误 (GWT)

java - 如何在SQL语句中使用生成的id?

java - 如何为没有主键或唯一键列的表创建 JPA 实体

java - HTML 到 Textile Java 库

java - Camel 和 Jackson 依赖性问题