2010-08-25 5 views
1

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

+2

Voir à propos de l'effacement de type en Java: http://download.oracle.com/javase/tutorial/java/generics/erasure.html – wheaties

+0

Donc je suppose que la réponse est "non". – tobiasbayer

+0

@tob: Dites-nous en plus sur ce que vous essayez de faire. Supposons que vous puissiez obtenir le paramètre type. Quoi alors? – polygenelubricants

Répondre

2

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

0

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();

+2

En fonction de ce qui est réellement souhaité, 'getClass()', peut ne pas fonctionner. Une 'Liste ' peut contenir un 'Dog', mais ce n'est pas une' List '. – polygenelubricants

+0

@polygenelubricants - vrai, mise à jour ... – froadie

+0

Je voudrais être en mesure de le faire sur une liste vide. Question éditée. – tobiasbayer

0

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? 
} 
+0

Je voudrais être en mesure de le faire sur une liste vide. Question éditée. – tobiasbayer

+0

effacement de type empêchera l'information que vous obtenez les informations que vous souhaitez obtenir au moment de l'exécution. – Chii

0

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.

+0

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 –

+0

@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

0

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

Questions connexes