自学内容网 自学内容网

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 来指定具体的泛型类型。具体步骤如下:

  1. 创建一个 TypeReference 的匿名子类,指定具体的泛型类型。
  2. 在反序列化方法中传入这个匿名子类对象。

例如,假设有一个 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)!