Как сделать метод универсальным с помощью дженериков
Пробую сделать метод 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
→ Ссылка
- Информация о типах стирается после компиляции, чтобы правильно передать генерик-тип в ваш метод, используйте
TypeToken - Уберите неиспользуемый аргумент в методе
- Не создавайте объект Gson при каждом парсинге
- Поправьте параметр у 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'}