Как сделать метод универсальным с помощью дженериков

Пробую сделать метод importFromJSON универсальным для работы с разными классами. Но что то я запутался я с этими дженериками.

private <T> List<T> importFromJSON(DataItems<T> dataItems) { 
  try(FileInputStream fileInputStream = context.openFileInput(fileName);
      InputStreamReader streamReader = new InputStreamReader(fileInputStream)){
  Gson gson = new Gson(); 
  dataItems = gson.fromJson(streamReader, DataItems<>.class); 
  return  dataItems.getList(); 
 } 
 catch (IOException ex){ 
  ex.printStackTrace(); 
 } 
 return null; 
}

DataItems.java:

public class DataItems<E> { 
 
    private List<E> list; 
 
    public List<E> getList() { 
        return list; 
    } 
 
    public void setList(List<E> list) { 
        this.list = list; 
    } 
} 

House.java:

public class House { 
    int number; 
    String name; 
} 

Вызываю этот метод уже с конкретным типом

DataItems<House> dataItems = new DataItems<>(); 
importFromJSON(dataItems); 

файл json

{"list":[{"name":"01","id":1},{"name":"02","id":2}]}

Все читается, в результате выполнения importFromJSON я получаю список объектов, но вот только вместо типа int, там почему то тип Double И при попытке вытащить из этого списка объект

House house = (House) list.get(0); 

list это переменная класса DataItems.

получаю Exception:

java.lang.ClassCastException LinkedTreeMap cannot be cast to House

Ответы (1 шт):

Автор решения: Vadik
  1. Информация о типах стирается после компиляции, чтобы правильно передать генерик-тип в ваш метод, используйте TypeToken
  2. Уберите неиспользуемый аргумент в методе
  3. Не создавайте объект Gson при каждом парсинге
  4. Поправьте параметр у House: переименуйте number в id

Получится такой метод:

private <T> List<T> importFromJson(TypeToken<DataItems<T>> typeToken) {
    try (Reader reader = new InputStreamReader(openFileInput(...))) {
        DataItems<T> items = gson.fromJson(reader, typeToken.getType());
        return items.getList();
    } catch (IOException exception) {
        throw new RuntimeException("Cannot import from json", exception);
    }
}

Работает так:

List<House> houses = importFromJson(new TypeToken<>() {});
House house = houses.get(0);
System.out.println(house);

Результат:

House{id=1, name='01'}
→ Ссылка