概要
借助对TypeToken原理的分析,加强对泛型擦除的理解,使得我们能够知道什么时候,通过什么方式可以获取到泛型的类型。
泛型擦除
众所周知,Java的泛型只在编译时有效,到了运行时这个泛型类型就会被擦除掉,即List和List在运行时其实都是List类型。
为什么选择这种实现机制?不擦除不行么?在Java诞生10年后,才想实现类似于C++模板的概念,即泛型。Java的类库是Java生态中非常宝贵的财富,必须保证向后兼容(即现有的代码和类文件依旧合法)和迁移兼容(泛化的代码和非泛化的代码可互相调用)基于上面这两个背景和考虑,Java设计者采取了“类型擦除”这种折中的实现方式。
同时正正有这个这么“坑”的机制,令到我们无法在运行期间随心所欲的获取到泛型参数的具体类型。
TypeToken
使用
使用过Gson的同学都知道在反序列化时需要定义一个TypeToken类型,像这样
private Type type = new TypeToken<List<Map<String, Foo>>>(){}.getType();
//调用fromJson方法时把type传过去,如果type的类型和json保持一致,则可以反序列化出来
gson.fromJson(json, type);
三个问题
为什么要用TypeToken来定义反序列化的类型?正如上面说的,如果直接把List<Map<String, Foo>>的类型传过去&