2016-04-25 4 views
0

Ich habe eine Funktion, die eine Liste von Objekten eines Typs erstellen muss, der als generische übergeben wird.Java Liste von parametrisierten generischen Typ erstellt verschiedene Arten von Objekten

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; 
} 

Als ich bei der Art der Objekte in der Ergebnisliste sehen sie sind nicht vom Typ T (T werden verschiedene Klassen, die ich definiert), aber vom Typ com.google.gson.internal.LinkedTreeMap.

Weiß jemand warum? Und wie könnte ich es so machen, dass die zurückgegebene Liste vom Typ T ist?

Antwort

4

Es ist, weil generische Typ Tokens nicht wegen Löschung funktionieren.

Sie müssen die TypeToken<List<T>> als einen konkret instanziierten Parameter injizieren.

public static <T> List<T> readJsonFile(
    final String filePath, final TypeToken<List<T>> typeToken) { 
    // ... 
    objectsFromFile = gson.fromJson(br, typeToken.getType()); 
    // ... 
} 

Und dann nennen dies als:

readJsonFile("/path/to/file.json", new TypeToken<List<String>>() {}); 
+0

Ausgezeichnete Antwort danke. Ich bin neu in der Arbeit mit Generika, also bin ich mir nicht sicher, was Löschung ist, aber ich werde das überprüfen. – dragosb

+0

Es bedeutet im Grunde, dass Sie zur Laufzeit nicht auf 'T' zugreifen können, weil Generika implementiert sind. Siehe https://docs.oracle.com/javase/tutorial/java/generics/erasure.html –

Verwandte Themen