JB Nizet 已经回答了原因。我只是想证明行动的原则。
您可以在其他课程中亲自尝试:
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>
如您所见,创建匿名子类会在运行时保留有关列表的具体泛型类型的类型信息。
TypeReference 的作用大致相同:
new TypeReference<Map<String, String>>() { }
有一个通用的超类:
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 的类型将无法区分。