Java参数化泛型类型列表创建不同类型的对象
问题描述:
我有一个函数需要创建一个类型的对象列表作为泛型传入。Java参数化泛型类型列表创建不同类型的对象
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型?
答
这是因为泛型类型令牌由于擦除而不起作用。
您需要注入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>>() {});
优秀的答案谢谢。我是新的与泛型工作,所以我不知道擦除是什么,但我会检查出来。 – dragosb
它基本上意味着你不能在运行时访问'T',因为泛型实现的方式。请参阅https://docs.oracle.com/javase/tutorial/java/generics/erasure.html –