Ich habe in etwa der folgenden StrukturInstanziieren Sie das untergeordnete Objekt mit den Parametern des übergeordneten Objekts, das mit GSON deserialisiert wird, und verwenden Sie Generics?
class MyDeserialParent<T extends MyChildInterface> {
MyChildInterface mSerialChild;
... //some other fields (not 'type')
}
Aber es ist von einer unordentlichen JSON Struktur deserialisiert die beiden Eigenschaften des Kindes auf dem übergeordneten Knoten zurückgegeben werden, wie folgt.
{
"myDeserialParents" : [
{
... //some parent properties
"type": "value", //used in a TypeAdapter to choose child implementation
"childProp1": "1",
"childProp2": "2",
},
... //more in this list
]
}
Offensichtlich verhindert dies mich von nur mSerialChild Anmerkungen versehen mit SerializedName
und lassen ein TypeAdapter
seine Magie arbeiten. Also was ich hoffe zu tun ist, wenn MyDeserialParent
deserialised ist, benutze "type", um die korrekte Betonklasse von MyChildInterface
zu finden und eine neue mit childProp1
und childProp2
als Parameter für den Konstruktor zu erstellen. Ich weiß nicht, wie ich das machen soll.
kann ich mich vorstellen, einen TypeAdapter
(JsonDeserializer
) für MyDeserialParent
mit und in deserialize
das Typ-Feld erhalten (wie auch die beiden Kinder Eigenschaften), dann instanziiert den richtigen Beton für MyChildInterface
mich.
Das bedeutet dann, ich muss meine MyDeserialParent
Klasse (mit context.deserialize(json, MyDeserialParent.class)
) erstellen und einen Setter mit MyChildInterface
Instanz aufrufen. Das fühlt sich falsch an, als würde mir etwas fehlen. Gibt es einen besseren Weg?
Gibt es auch eine Möglichkeit, die Generics anzugeben (T
auf MyDeserialParent
), wenn ich manuell auch das übergeordnete Objekt erstellen? Oder bedeutet Type Erasure, dass dies nicht möglich ist? (Diese Frage ist weniger wichtig becase ich weiß, ich kann Typ Sicherheit bekommen, wenn ich bestimmte Subtypen von MyDeserialParent, die bereits auf T
ableiten, aber ich möchte es vermeiden)
Dies ist sehr nah an meiner eigenen Lösung, nicht die andere Lösung, die ich gesucht habe, sondern eine gute Antwort, die die meisten Menschen, die hierher kommen werden, decken wird –