Мне кажется, я понимаю ваш вопрос.Вы хотите сериализовать Foo<T>
, и у вас есть объект класса T
во время выполнения (но это не исправлено во время компиляции).Поэтому предлагаемое в Gson решение по созданию анонимного подкласса TypeToken
не работает, поскольку для этого необходимо, чтобы параметризованный тип (например, Foo<String>
) был жестко запрограммирован во время компиляции, и он не работает, если вы используете что-то вродеFoo<T>
.
Однако давайте посмотрим, что на самом деле выполняет метод TypeToken
на сайте Gson.Вы создаете объект анонимного подкласса TypeToken
, а затем запрашиваете его параметр типа, используя его метод getType()
.Суперкласс класса является частью его метаданных и включает в себя общие параметры своего суперкласса.Таким образом, во время выполнения он может посмотреть собственную иерархию наследования и выяснить, какой параметр типа вы использовали для TypeToken
, а затем вернуть экземпляр java.lang.reflect.Type
для этого типа (который, если он параметризован, будет * 1013).* пример).Получив этот экземпляр Type
, вы должны передать его как второй аргумент toGson()
.
Все, что нам нужно сделать, - это найти другой способ создания этого экземпляра ParameterizedType
.ParameterizedType
- это интерфейс, но, к сожалению, общедоступный API Java не предоставляет никаких конкретных реализаций или какого-либо способа динамического создания ParameterizedType
.Похоже, есть класс с именем ParameterizedTypeImpl
в частных API Sun и в коде Gson, который вы можете использовать (, например, здесь ).Вы можете просто скопировать код и переименовать его в свой собственный класс.Затем, чтобы создать Type
объект, представляющий Foo<String>
во время выполнения, вы можете просто сделать что-то вроде new ParameterizedTypeImpl(Foo.class, new Type[]{String.class}, null)
(не проверено)