2016-04-25 170 views
0

我有一個函數需要創建一個類型的對象列表作爲泛型傳入。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型?

回答

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

優秀的答案謝謝。我是新的與泛型工作,所以我不知道擦除是什麼,但我會檢查出來。 – dragosb

+0

它基本上意味着你不能在運行時訪問'T',因爲泛型實現的方式。請參閱https://docs.oracle.com/javase/tutorial/java/generics/erasure.html –