当前位置: 首页 > news >正文

如何解【决泛型作为运行时参数】时类型擦除问题

在Java中直接使用泛型类型(如Pair<String, Integer>)作为运行时类型参数时,会遇到类型擦除问题。以下是几种正确的实现方式:


方法1:使用明确的Class声明(推荐)

// 1. 定义一个具体类替代泛型
public class StringIntPair extends Pair<String, Integer> {
    public StringIntPair(String first, Integer second) {
        super(first, second);
    }
}

// 2. 使用时指定具体类型
StringIntPair pair = patientList.getObject(i, StringIntPair.class);

方法2:通过TypeReference处理泛型(Jackson/Gson等库)

import com.fasterxml.jackson.core.type.TypeReference;

// 获取List中的Pair对象
List<Pair<String, Integer>> pairs = objectMapper.readValue(
    patientList.toString(),
    new TypeReference<List<Pair<String, Integer>>>(){}
);

// 或直接获取单个Pair
Pair<String, Integer> pair = objectMapper.readValue(
    patientList.getJSONObject(i).toString(),
    new TypeReference<Pair<String, Integer>>(){}
);

方法3:强制类型转换(需确保类型安全)

// 假设patientList返回的是org.apache.commons.lang3.tuple.Pair
Object obj = patientList.getObject(i);
Pair<String, Integer> pair = (Pair<String, Integer>) obj;

方法4:手动解析JSON(通用方案)

JSONObject jsonPair = patientList.getJSONObject(i);
Pair<String, Integer> pair = Pair.of(
    jsonPair.getString("key"),  // 根据实际JSON字段名调整
    jsonPair.getInt("value")
);

关键点说明

  1. 类型擦除问题
    Java运行时无法获取Pair<String, Integer>.class这样的泛型类型,需通过具体类或TypeReference解决。

  2. 库依赖建议

    • Apache Commons Lang3 的Pair类:org.apache.commons.lang3.tuple.Pair
    • Jackson的TypeReferencecom.fasterxml.jackson.core.type.TypeReference
  3. 完整示例(Jackson)

    ObjectMapper mapper = new ObjectMapper();
    List<Pair<String, Integer>> pairs = mapper.readValue(
        patientList.toString(),
        new TypeReference<List<Pair<String, Integer>>>(){}
    );
    
  4. Gson实现

    Gson gson = new Gson();
    Type pairType = new TypeToken<Pair<String, Integer>>(){}.getType();
    Pair<String, Integer> pair = gson.fromJson(patientList.get(i).toString(), pairType);
    

根据你的JSON结构和使用的库选择最适合的方法。如果patientList是特定库的自定义类型,请提供更详细的信息以便给出精准方案。

http://www.dtcms.com/a/122953.html

相关文章:

  • PowerBI数据建模2:计算选项、计算组
  • JavaScript实用API
  • 计算机视觉4——特征点及其描述子
  • LeetCode344反转字符串
  • 亮相2025全球分布式云大会,火山引擎边缘云落地AI新场景
  • 1. 两数之和 leetcode
  • 后缀自动机SAM练习笔记 (一)
  • Pandas-按索引从df中读取指定一个或者多个元素
  • Pytorch Dataset问题解决:数据集读取报错DatasetGenerationError或OSError
  • win10离线环境下配置wsl2和vscode远程开发环境
  • spark-Core
  • 基于vue3与supabase系统认证机制
  • 大模型分布式推理和量化部署
  • 高可用之战:Redis Sentinal(哨兵模式)
  • Docker基础2
  • 【教程】Windows 电脑部署使用 config2spec 详细教程
  • 基于ueditor编辑器的功能开发之给编辑器图片增加水印功能
  • 智能防灾网:气象灾害风险管理系统的科技力量与未来蓝图
  • Mybatis的springboot项目使用
  • 【leetcode hot 100 198】打家劫舍
  • 【力扣hot100题】(074)前 K 个高频元素
  • Nginx之https重定向为http
  • 【DvAdmin】接口返回 emoji 显示 ?解决方法
  • ArkTS语言入门之接口、泛型、空安全、特殊运算符等
  • vue3的router.ts中,在children和不在的区别
  • Python 爬取 1688.item_get_factory 接口:获取工厂档案信息实战指南
  • MySQL中FIND_IN_SET函数与INSTR函数用法解析
  • 鸿蒙小案例---心情日记
  • VSCode解决中文乱码方法
  • 【c语言】深度剖析数据在内存中的存储