类型擦除及其解决方案 TypeToken 或TypeReference

文章解释了Java中泛型的类型擦除机制,即在编译期间将泛型转换为原始类型,导致在运行时无法获取实际的泛型信息。这在反序列化时成为一个问题,如示例所示,当尝试将JSON转换为`ApiResponse<User>`时,如果不指定类型信息,Gson会默认转换为`LinkedTreeMap`。为解决此问题,文章推荐使用Gson的`TypeToken`或fastjson的`TypeReference`来保留类型信息,确保正确反序列化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类型擦除名词解释与存在问题

当我们使用Java的泛型时,编译器会在编译时执行类型擦除。类型擦除是指编译器会将泛型类型转换为其原始类型,以便在运行时使用。例如,List<String>将被转换为List<Object>,在运行时不再有类型参数。这种类型擦除的机制导致在反序列化时,我们无法获取实际的泛型类型信息,而只能得到原始类型,这就是类型擦除所带来的问题。

听起来很懵,没关系,看一下例子你就知道了。

案例

1. 泛型类 ApiResponse
package org.example.springboot.job.domain;

import lombok.Data;

public class ApiResponse<T> {
   
    private int code;
    private String message;
    private T data;

    public int getCode() {
   
        return code;
    }

    public void setCode(int code) {
   
        this.code = code;
    }

    public String getMessage() {
   
        return message;
    }

    public void setMessage(String message) {
   
        this.message = message;
    }

    public T getData() {
   
        return data;
    }

    public void setData(T data) {
   
        this.data <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值