powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Десериализация json в обобщенный класс
4 сообщений из 4, страница 1 из 1
Десериализация json в обобщенный класс
    #38651287
Максим Н
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использую GSON для десериализации:

Код: java
1.
TestObj = new Gson().fromJson(s, TestObj.Class);



2-й параметр конструктора это либо Class<T> , либо Type .

Как можно сделать то же самое, но с генерик-типом?

Т.е. у меня есть метод:

Код: java
1.
public static <T extends ISavedObject> T load(File path)



И я хочу звать его так:

Код: java
1.
List<Obj> list = SavedObjectService.loadAll(new File("data/objects")



Это возможно?
У меня не получилось...


На данный момент решаю так (на SO, но некрасиво получается и путанно), добавляю новый входной параметр с классом:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    public static <T extends ISavedObject> T load(File path, Class<T> clazz) {
        T t = null;
        try {
            String s = FileUtils.readFileToString(path, ENCODING);
            t = new Gson().fromJson(s, clazz);
        } catch (IOException ex) {
            Logger.getLogger(SavedObjectService.class.getName()).log(Level.SEVERE, null, ex);
        }
        return t;
    }



вызываю так:
Код: java
1.
List<Obj> list = SavedObjectService.loadAll(new File("data/objects"), Obj.class);



Т.е. класс нужно в 2-х местах указывать...
...
Рейтинг: 0 / 0
Десериализация json в обобщенный класс
    #38651315
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, нельзя.

Самому класс нужно указывать только в параметре метода. Тип возвращаемого значения IDE может сгенерировать сама.
...
Рейтинг: 0 / 0
Десериализация json в обобщенный класс
    #38651484
Максим Н
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mkНет, нельзя.

Самому класс нужно указывать только в параметре метода. Тип возвращаемого значения IDE может сгенерировать сама.

Ткните ссылкой пожалуйста, почему я не могу сделать так:

Код: java
1.
List<Obj> list = SavedObjectService.<List<Obj>>loadAll(new File("data/objects"));
...
Рейтинг: 0 / 0
Десериализация json в обобщенный класс
    #38651510
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Максим Нavp.mkНет, нельзя.

Самому класс нужно указывать только в параметре метода. Тип возвращаемого значения IDE может сгенерировать сама.

Ткните ссылкой пожалуйста, почему я не могу сделать так:

Код: java
1.
List<Obj> list = SavedObjectService.<List<Obj>>loadAll(new File("data/objects"));


Потому что:
1. List не extends ISavedObject
2. Type Erasure (параметизированные типы после компилции заменяются на тип Object/нижнюю границу (bound) - у вас это ISavedObject)
=> Из вашей ф-ии создатся примерно вот такое по смыслу:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    public static ISavedObject load(File path) {
        ISavedObject t = null;
        try {
            String s = FileUtils.readFileToString(path, ENCODING);
            t = new Gson().fromJson(s, t); // compile error т.к. это нельзя, т.к. нет смысла т.к. это всегда: t = new Gson().fromJson(s, ISavedObject);
        } catch (IOException ex) {
            Logger.getLogger(SavedObjectService.class.getName()).log(Level.SEVERE, null, ex);
        }
        return t;
    }



И еще помойму у вас "архитектура" немного странная...Exception явно надо выше перенаправлять. Или будете в вызывающем методе проверять на null значение, а нафига тогда exception'ы ?
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Десериализация json в обобщенный класс
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]