J'ai un List<?> list
en Java. Existe-t-il un moyen de déterminer le type du contenu de cette liste lors de l'exécution lorsque la liste est vide?Détermination du type d'entrées de liste
Répondre
Malheureusement, vous ne pouvez pas déterminer le type en raison de l'effacement - en fait, même si la liste ne vous vide ne peut toujours pas déterminer de manière fiable ce que la liste est vraiment.
Disons maintenant votre liste <? > contient 2 éléments: un double et et Integer ... il serait non trivial de comprendre qu'il pourrait être une liste < Numéro > ... et même alors, il peut vraiment être un objet Liste <Objet> et quelqu'un pourrait ajouter un Chaîne plus tard.
En outre, disons que c'est vraiment une liste < Liste < Chaîne > >. Le plus vous comprendrez sans essayer de recurse est que c'est une liste < Liste <? > >.
Il y a un côté lumineux. En fonction de votre situation, vous pouvez utiliser des jetons de type pour contourner l'effacement de manière sécurisée. Voir un article génial ici: http://gafter.blogspot.com/2006/12/super-type-tokens.html
En supposant qu'il ya au moins un objet dans la liste, pour obtenir le type de la liste - list.get(0).getClass().getSuperclass.getName();
Pour obtenir le type d'un objet individuel - list.get(0).getClass().getName();
En fonction de ce qui est réellement souhaité, 'getClass()', peut ne pas fonctionner. Une 'Liste
@polygenelubricants - vrai, mise à jour ... – froadie
Je voudrais être en mesure de le faire sur une liste vide. Question éditée. – tobiasbayer
Oui, il y a. Vous pouvez itérer sur chaque objet de la liste et appeler la méthode .getClass() et imprimer son nom de classe (ou faire différentes choses en fonction de la classe).
par exemple,
for (Object o : list) {
if (o.getClass().equals(MyClass.class)) {
MyClass myClass = (MyClass) o;
//do something with myClass etc etc
}
//...more if statements?
}
Je voudrais être en mesure de le faire sur une liste vide. Question éditée. – tobiasbayer
effacement de type empêchera l'information que vous obtenez les informations que vous souhaitez obtenir au moment de l'exécution. – Chii
Comme le dit Chii, vous pouvez itérer sur chaque élément. A part cela, vous ne pouvez pas savoir car techniquement, vous pouvez mettre un objet dans un List
.
par exemple,
List list = new ArrayList();
list.add(new Integer(1));
list.add(new Integer(2));
list.add("string");
list.add(new Double(0.2));
Dans l'exemple ci-dessus, ce que le type de list
serait? Il n'y a pas de réponse à cette question.
o alquimista: 'tob' demande des génériques. Selon les génériques: Une fois que vous avez mentionné que la liste peut contenir une instance de x alors votre liste ne peut pas avoir –
@Rakesh: ça peut _can_ si vous ignorez les avertissements, utilisez les types bruts/conversion non contrôlée, etc. 't, mais vous pouvez, si vous voulez vraiment, ou par accident. – polygenelubricants
Si la liste est vide, pas froadie
est correcte mais si la liste est vide, selon la Type erasure
il est impossible de trouver le type d'objet d'une liste peut avoir.
En java,
ArrayList<Integer> li = new ArrayList<Integer>();
ArrayList<Float> lf = new ArrayList<Float>();
if (li.getClass() == lf.getClass()) // evaluates to true
System.out.println("Equal");
Source: http://en.wikipedia.org/wiki/Generics_in_Java#Type_erasure
- 1. Détermination du type d'élément WPF
- 2. Détermination du type d'un objet en JavaScript
- 3. Détermination du type mime d'un fichier
- 4. Détermination du type de résultat dans OnException du contrôleur
- 5. Détermination d'un type d'objet
- 6. Détermination du type de papier actuel pour l'imprimante par défaut
- 7. Détermination du type de fichier dans le dossier des ressources
- 8. Détermination du type de contenu de la page
- 9. Détermination du type dans le modèle de fonction
- 10. Détermination du minimum d'une liste de n éléments
- 11. Détermination du type d'application en cours d'exécution (.NET)
- 12. Détermination du type MIME d'un fichier local (type de contenu) Avec PHP
- 13. Détermination du modèle d'iPhone
- 14. Détermination du nombre de combinaisons possibles
- 15. Algorithme de détermination du taux de change
- 16. Détermination du système CLR Directory
- 17. Détermination du composant flash chargé
- 18. Détermination du style visuel utilisé?
- 19. Détermination de l'objet sélectionné à l'aide d'une zone de liste
- 20. Détermination du nom de l'exécutable C
- 21. Détermination de la "charge du système"
- 22. Détermination du résultat de l'instruction SQL MERGE
- 23. Détermination du type pour un paramètre de méthode générique au moment de l'exécution
- 24. SQL Server 2005: Détermination du type de données de la variable
- 25. Détermination du type de commande sql dans le déclencheur dans le serveur SQL 2000
- 26. Détermination de l'efficacité du cache processeur du code C
- 27. Détermination du nom du fichier de police TTF
- 28. Détermination de la culture du serveur de services de reporting
- 29. Détermination du modèle correspondant à l'aide de Regex.Matches
- 30. Détermination du fichier que vous utilisez
Voir à propos de l'effacement de type en Java: http://download.oracle.com/javase/tutorial/java/generics/erasure.html – wheaties
Donc je suppose que la réponse est "non". – tobiasbayer
@tob: Dites-nous en plus sur ce que vous essayez de faire. Supposons que vous puissiez obtenir le paramètre type. Quoi alors? – polygenelubricants