Java参数化泛型类型列表创建不同类型的对象

时间:2016-04-25 12:37:08

标签: java json generics gson

我有一个函数需要创建一个以泛型方式传入的类型的对象列表。

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型?

1 个答案:

答案 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>>() {});