87 votes

Comment trouver le type de chaque objet dans une ArrayList <Object> ?

J'ai une ArrayList composée de différents éléments importés d'une base de données, composée de chaînes, de nombres, de doubles et d'ints. Existe-t-il un moyen d'utiliser une technique de type réflexion pour déterminer la nature de chaque type de données que chaque élément contient?

FYI: La raison pour laquelle il y a tellement de types de données est qu'il s'agit d'un morceau de code java en cours d'écriture qui doit être implémenté avec différentes bases de données.

101voto

Frank Krueger Points 27508

En C #:
Fixé avec recommandation de Mike

 ArrayList list = ...;
// List<object> list = ...;
foreach (object o in list) {
    if (o is int) {
        HandleInt((int)o);
    }
    else if (o is string) {
        HandleString((string)o);
    }
    ...
}
 

En Java:

 ArrayList<Object> list = ...;
for (Object o : list) {
    if (o.getClass().equals(Integer.TYPE)) {
        handleInt((int)o);
    }
    else if (o.getClass().equals(String.class)) {
        handleString((String)o);
    }
    ...
}
 

54voto

faran Points 2355

Vous pouvez utiliser la méthode getClass() ou utiliser instanceof. Par exemple

 for (Object obj : list) {
  if (obj instanceof String) {
   ...
  }
}
 

ou

 for (Object obj : list) {
 if (obj.getClass().equals(String.class)) {
   ...
 }
}
 

Notez que instanceof correspondra à des sous-classes. Par exemple, de C est une sous-classe de A , alors ce qui suit sera vrai:

 C c = new C();
assert c instanceof A;
 

Cependant, ce qui suit sera faux:

 C c = new C();
assert !c.getClass().equals(A.class)
 

45voto

Fabian Steeg Points 24261
for (Object object : list) {
    System.out.println(object.getClass().getName());
}

13voto

Heath Borders Points 8067

Vous ne voulez presque jamais utiliser quelque chose comme:

 Object o = ...
if (o.getClass().equals(Foo.class)) {
    ...
}
 

parce que vous ne tenez pas compte des sous-classes possibles. Vous voulez vraiment utiliser la classe # isAssignableFrom:

 Object o = ...
if (Foo.class.isAssignableFrom(o)) {
    ...
}
 

5voto

Reid Mac Points 802

En Java, utilisez simplement l'opérateur instanceof. Cela s’occupera également des sous-classes.

 ArrayList<Object> listOfObjects = new ArrayList<Object>();
for(Object obj: listOfObjects){
   if(obj instanceof String){
   }else if(obj instanceof Integer){
   }etc...
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X