J'écris une méthode de désérialisation qui convertit XML en un objet Java. Je voudrais le faire de manière dynamique et éviter d'écrire des références codées dures à des types spécifiques.
Par exemple, il s'agit d'une version simplifiée de l'une de mes classes. P>
MyObject obj = Serializer.fromXml("myxmldata", MyObject.class);
4 Réponses :
dans les génériques Java ne sont que du sucre de syntaxe et n'existent pas en runtime. C'est pourquoi vous ne pouvez pas créer de manière programmatique d'objets génériques en exécution. Essayez de créer une liste non générique et de lancer (Cependant, je ne suis pas sûr car mon expérience est limitée avec GWT). P>
Ce n'est pas tout à fait vrai. Si vous avez une classe myarray qui étendra l'arraylist
@OXBOW: une classe stockera le type paramétré de ses signatures de méthodes à des roulements. Une collection individuelle ne croit pas.
Vous devrez créer une liste STRY> STRY> CODE> code> (c'est-à-dire sans paramètres de type).
obj.setSubObjects(subs); //You'll get an "unchecked cast" warning at compile time
devrait être quelque chose de très proche de: espère que cela aide cela aide. p> p>
Merci, c'est ce que je cherchais. Pouvez-vous également expliquer comment je pourrais obtenir les informations de type pour SubObject dans l'instance de liste?
C'est le bit qui n'est pas présent, les informations de type générique des collections ne sont pas disponibles au moment de l'exécution de Java. Les génériques sont implémentés dans le compilateur.
Je suppose que le bit que vous êtes après est comment savoir quelle classe instancier pour vous ajouter à votre nouvel objet de la liste? Cette information n'est tout simplement pas disponible, vous pouvez ajouter votre auto en créant une annotation et en annotant le champ SUBObjects avec elle, quelque chose comme @SerialisationType (SubObject.class)
Je l'ai trouvé. Si vous appelez (paramétréype) champ.gegenericteryType ())). ToString () Vous pouvez voir le nom complet du type qui inclut SubObject. J'ai ensuite saisi le nom de la classe et j'ai créé une nouvelle instance par classe.forname ("SubObject"). NewInstance (). Très hacky, mais ça marche.
Pouvez-vous également fournir un exemple du fichier XML?
Et si les sous-observations sont déclarées comme une interface (comme une liste)?