java中的TypeReference类
java中的TypeReference类(这里是fastjson中TypeReference)
前言:Java 泛型在编译后会擦除泛型
类型信息。在运行时,程序无法直接获取泛型类型参数的具体类型信息。例如,无法通过反射
获取List<String>
中的String
类型信息。
所以,在java中进行泛型
的反序列化
需要用到TypeReference
类,下面说明的是fastjson
中的TypeReference。
PS: 对一个Object对象进行强制类型转化,将该Object对象强制转化为形如List<String>的类型是无法执行的,复杂的类型转化(泛型类型以及嵌套泛型)需要依靠TypeReference类。
fastjson中的TypeReference类说明文档https://github.com/alibaba/fastjson/wiki/TypeReference
1. TypeReference 是什么
TypeReference
是 Fastjson 提供的一个用于处理泛型反序列化的类。Java 语言在运行时会擦除泛型类型信息,导致在反序列化时无法直接获取到泛型的具体类型。TypeReference
通过创建一个匿名子类来保留泛型的类型信息,从而在反序列化时能够正确地还原为指定的泛型类型对象。
2. TypeReference 的作用
TypeReference
的主要作用是在反序列化场景中获取泛型参数。它支持泛型参数,方便一些框架实现通用的反序列化类,对复杂的类型可以很方便地进行反序列化。使用 TypeReference
可以明确指定反序列化的类型,能够比较方便地获取反序列化的数据。
3. TypeReference 的具体用法
3.1 基础用法
在使用 Fastjson 进行反序列化时,如果需要处理带有泛型的对象,可以使用 TypeReference
来指定具体的泛型类型。具体步骤如下:
- 创建一个
TypeReference
的匿名子类,指定具体的泛型类型。 - 在反序列化方法中传入这个匿名子类对象。
例如,假设有一个 JSON 字符串表示一个 List<String>
类型的对象,要将其反序列化为 List<String>
类型的 Java 对象,可以这样使用 TypeReference
:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import java.util.List;
public class TypeReferenceExample {
public static void main(String[] args) {
String json = "[\"apple\",\"banana\",\"orange\"]";
List<String> fruits = JSON.parseObject(json, new TypeReference<List<String>>() {}.getType());
System.out.println(fruits); // 输出:[apple, banana, orange]
}
}
在这个例子中,new TypeReference<List<String>>() {}
创建了一个 TypeReference
的匿名子类,指定了泛型类型为 List<String>
,然后通过 getType()
方法获取具体的类型信息,再将其作为参数传递给 JSON.parseObject
方法,从而成功地将 JSON 字符串反序列化为 List<String>
类型的 Java 对象。
3.2 处理复杂泛型类型
TypeReference
也可以处理更复杂的泛型类型,例如嵌套泛型和多参数泛型。以下是一些示例:
嵌套泛型示例:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import java.util.List;
import java.util.Map;
public class TypeReferenceExample {
public static void main(String[] args) {
String json = "[{\"name\":\"apple\",\"price\":5},{\"name\":\"banana\",\"price\":3}]";
List<Map<String, Object>> fruits = JSON.parseObject(json, new TypeReference<List<Map<String, Object>>>() {}.getType());
System.out.println(fruits); // 输出:[{name=apple, price=5}, {name=banana, price=3}]
}
}
在这个例子中,TypeReference
指定了泛型类型为 List<Map<String, Object>>
,成功地将 JSON 字符串反序列化为嵌套泛型类型的 Java 对象。
5. 注意事项
TypeReference
不能用于创建带有通配符的泛型类型,例如List<?>
或List<? extends CharSequence>
。- 使用
TypeReference
时,通常需要创建一个匿名子类,以便在运行时能够获取到泛型类型信息。
除以上外,还有部分与TypeReference相关的类型,之后会补充,未完待续…
原文地址:https://blog.csdn.net/m0_70484213/article/details/145227421
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!