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