Fastjson用TypeReference解决泛型擦除,需通过匿名子类保留编译期泛型信息;必须写成new TypeReference(){}形式,否则无法获取真实类型。

Fastjson 用 TypeReference 解决泛型擦除,核心就一点:靠匿名子类把编译期的泛型签名“冻住”,让运行时还能读到完整类型信息。不写花括号、不匿名,就等于没传类型。
为什么必须写成 new TypeReference() {}
Java 编译后会把 ListgetClass().getGenericSuperclass(),只有匿名子类才能在字节码中保留父类的泛型实参。普通变量引用或直接 new TypeReference
- ✅ 正确:new TypeReference
- >() {}
- ❌ 错误:TypeReference
- > ref = new TypeReference
- >();
- ❌ 错误:JSON.parseObject(json, TypeReference.class)
解析带泛型的包装类(比如 Response)
如果服务返回的是统一结构:{"code":200,"data":{"id":1,"name":"张三"}},对应类为 Response<user></user>,就不能只写 Response.class——那样 data 字段会变成 JSONObject。
要写全泛型链:
立即学习“Java免费学习笔记(深入)”;
Response<user> res = JSON.parseObject(json, new TypeReference<response>>() {});</response></user>Response<list>> res = JSON.parseObject(json, new TypeReference<response>>>() {});</response></list>
运行时才确定内层类型(如 T 来自参数)
当泛型实际类型是动态的(比如方法入参传进来的 Class),得用 TypeReference 的带参构造器:
- 支持从 Fastjson 1.2.9+:
new TypeReference<response>>>(UserDTO.class) {}</response> - 这个构造器只替换最内层 T(即 UserDTO),外层 Response
> 还是要写死 - 不适用于多级动态,比如不能用
Page.class替换 Page 那一层
嵌套 Map 或复杂结构怎么写
像 Map<string list>></string> 或 Map<string map list>>></string> 这种,关键就是把整个泛型表达式完整写进尖括号里,再套上匿名子类:
Map<string list>> map = JSON.parseObject(json, new TypeReference<map list>>>() {});</map></string>Map<string map list>>> nested = JSON.parseObject(json, new TypeReference<map map list>>>>() {});</map></string>


















