我有一个函数需要创建一个以泛型方式传入的类型的对象列表。
public static <T> List<T> readJsonFile(final String filePath) {
List<T> objectsFromFile=null;
File file = new File(System.getProperty("catalina.base") + filePath);
Gson gson = new Gson();
try (FileInputStream JSON = new FileInputStream(file)) {
BufferedReader br = new BufferedReader(new InputStreamReader(JSON));
objectsFromFile = gson.fromJson(br, new TypeToken<List<T>>() {
}.getType());
} catch (Exception e) {
e.printStackTrace();
}
return objectsFromFile;
}
当我查看结果列表中的对象类型时,它们不是T类型(T将是我定义的不同类),但类型为 com.google.gson.internal.LinkedTreeMap 。
有谁知道为什么?我怎么能这样做,所以返回的列表是T型?
答案 0 :(得分:4)
这是因为通用类型令牌因擦除而无法正常工作。
您需要将TypeToken<List<T>>
作为参数注入,具体实例化。
public static <T> List<T> readJsonFile(
final String filePath, final TypeToken<List<T>> typeToken) {
// ...
objectsFromFile = gson.fromJson(br, typeToken.getType());
// ...
}
然后将其称为:
readJsonFile("/path/to/file.json", new TypeToken<List<String>>() {});