编译前:
public static void main(String[] args) { Class c1 = new ArrayList<String>().getClass(); Class c2 = new ArrayList<Integer>().getClass(); System.out.println(c1 == c2); }
编译后:
public static void main(String[] args) { new ArrayList(); new ArrayList(); }
可以看到,在编译后的class文件中,ArrayList所声明的泛型不存在了;由此可知,如果想在程序运行期间获取泛型,看似是一件不可能完成的事情!
Map<Integer, Long> map = new HashMap<>(); map.put(0, 0L); map.put(1, 1L); String a = JSON.toJSONString(map); map = JSON.parseObject(a, new TypeReference<Map<Integer, Long>>(){});
按照泛型擦除,泛型在编译后的class文件中就不存在了, 知会保留原始类型(Type的概念),那么TypeReference又是如何获取到具体的泛型类型的呢?
查看TypeReference的源码,发现在其构造方法中,主要使用到了getGenericSuperclass()和getActualTypeArguments()两个方法,getGenericSuperclass()返回的是此对象带“泛型”的父类,而getActualTypeArguments()返回的是此父类中实际类型参数的Type 对象数组,说白了就是TypeReference<>中的泛型;
参考:https://www.jianshu.com/p/1f608fd05e20
参考:https://yq.aliyun.com/articles/257488
原文:https://www.cnblogs.com/wangsong412/p/11794381.html