У меня примерно следующая структура
class MyDeserialParent<T extends MyChildInterface> {
MyChildInterface mSerialChild;
... //some other fields (not 'type')
}
Но это десериализовано из грязной структуры JSON, два свойства потомка возвращаются на родительский узел, как показано ниже.
{
"myDeserialParents" : [
{
... //some parent properties
"type": "value", //used in a TypeAdapter to choose child implementation
"childProp1": "1",
"childProp2": "2",
},
... //more in this list
]
}
Очевидно, это мешает мне просто аннотировать mSerialChild с помощью SerializedName
и позволить TypeAdapter
чудеса. Итак, я надеюсь, что при десериализации MyDeserialParent
использовать "тип", чтобы найти правильный конкретный класс MyChildInterface
и создать новый, используя childProp1
и childProp2
качестве параметров для конструктора. Я не знаю, как это сделать.
Я могу представить себе использование TypeAdapter
(JsonDeserializer
) для MyDeserialParent
и в deserialize
получить поле типа (а также два дочерних свойства), а затем создать экземпляр правильного бетона для MyChildInterface
самостоятельно.
Это значит, что мне нужно создать свой класс MyDeserialParent
(с context.deserialize(json, MyDeserialParent.class)
) и вызвать сеттер с экземпляром MyChildInterface
. Это неправильно, как будто я что-то упустил. Есть ли способ лучше?
Есть ли способ указать универсальные (T
на MyDeserialParent
), если я вручную создаю родительский объект? или Type Erasure означает, что нет способа сделать это? (Этот вопрос менее важен, потому что я знаю, что могу получить безопасность типов, если использую определенные подтипы MyDeserialParent, которые вместо этого уже выводят T
, но я бы хотел этого избежать)