2016-04-25 2 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. –

Смежные вопросы