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>>() {}); 
+0

优秀的答案谢谢。我是新的与泛型工作,所以我不知道擦除是什么,但我会检查出来。 – dragosb

+0

它基本上意味着你不能在运行时访问'T',因为泛型实现的方式。请参阅https://docs.oracle.com/javase/tutorial/java/generics/erasure.html –