2010-04-13 4 views
3

Dans un problème de sérialisation Java, je souhaite enregistrer un nom de classe et j'ai des problèmes avec les classes génériques. Par exemple:
- Si je ArrayList<String> listToDump = new ArrayList<String>();
- Si je prends le nom: listToDump.getName(); ou listToDump.getCanonicalName();
- Je ferai java.util.ArrayList ou ArrayList
- Et je veux avoir java.util.ArrayList<String> ou ArrayList<String>Obtenir un nom de classe avec des informations génériques

Toutes les idées sur Comment puis-je faire ceci?
Damien.

Répondre

6
  1. Le cas que vous avez décrit ne peut pas travailler, vous faites probablement listToDump.getClass().getName()

  2. Il n'y a pas moyen d'obtenir des informations sur le type générique d'exécution en raison de type erasure:

    Lorsque un type générique est instancié, le compilateur traduit ces types par une technique appelée type d'effacement - un processus où le compilateur supprime tous informations relatives aux paramètres de type et arguments de type dans une classe ou méthode .

  3. Si vous décrivez en détail quel problème vous tentez de résoudre, nous vous proposerons peut-être des solutions de contournement ou même des solutions. L'effacement de type ne devrait pas être un gros problème, il peut juste changer la façon de faire certaines choses.

+0

(réponse au point 3): Un programme qui utilise mon cri 'dump' et un bug quand il trouve une collection non générique. Donc je voulais faire une solution de contournement de mon côté, mais en voyant vos réponses, je vais dire au programmeur du programme buggé de voir ce qui s'est passé dans son côté parce que ce n'est pas normal :) – Damien

1

Basculez vers une langue qui le prend en charge.

Le comportement que vous décrivez s'appelle effacement de type et c'est ainsi que les génériques sont implémentés en Java.

3

Si listToDump est un champ, vous pouvez utiliser Field.getGenericType(). Mais les génériques Java sont effacés lors de l'exécution - il y a juste une instance ArrayList. Vous pouvez regarder son contenu et trouver le supertype commun, mais cela devient très compliqué lorsque des interfaces sont impliquées, et pourrait être plus spécifique que vous le souhaitez. Mais comment envisagez-vous réellement d'utiliser l'information?

1

Je pense que si vous extrayez un élément du List alors essayez d'extraire son nom de classe pour obtenir le résultat que vous recherchez.

Questions connexes