如何解【决泛型作为运行时参数】时类型擦除问题
在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")
);
关键点说明
-
类型擦除问题
Java运行时无法获取Pair<String, Integer>.class
这样的泛型类型,需通过具体类或TypeReference
解决。 -
库依赖建议
- Apache Commons Lang3 的
Pair
类:org.apache.commons.lang3.tuple.Pair
- Jackson的
TypeReference
:com.fasterxml.jackson.core.type.TypeReference
- Apache Commons Lang3 的
-
完整示例(Jackson)
ObjectMapper mapper = new ObjectMapper(); List<Pair<String, Integer>> pairs = mapper.readValue( patientList.toString(), new TypeReference<List<Pair<String, Integer>>>(){} );
-
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
是特定库的自定义类型,请提供更详细的信息以便给出精准方案。