У меня примерно следующая структура
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, но я бы хотел этого избежать)