Comment est-ce que je trouve quel type chaque object est dans un ArrayList ?

J’ai une ArrayList composée de différents éléments importés à partir d’une firebase database, composée de chaînes, de nombres, de doubles et d’ints. Y a-t-il un moyen d’utiliser une technique de type reflection pour savoir quel type de données chaque élément contient?

FYI: La raison pour laquelle il existe tant de types de données est qu’il s’agit d’un morceau de code java destiné à être implémenté avec différentes bases de données.

En C #:
Corrigé avec la recommandation de Mike

ArrayList list = ...; // List list = ...; foreach (object o in list) { if (o is int) { HandleInt((int)o); } else if (o is ssortingng) { HandleSsortingng((ssortingng)o); } ... } 

En Java:

 ArrayList list = ...; for (Object o : list) { if (o instanceof Integer)) { handleInt((int)o); } else if (o instanceof Ssortingng)) { handleSsortingng((Ssortingng)o); } ... } 

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

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

ou

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

Notez que instanceof correspondra aux 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, les éléments suivants seront faux:

 C c = new C(); assert !c.getClass().equals(A.class) 
 for (Object object : list) { System.out.println(object.getClass().getName()); } 

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)) { ... } 

En Java, utilisez simplement l’opérateur instanceof. Cela prendra également en charge les sous-classes.

 ArrayList listOfObjects = new ArrayList(); for(Object obj: listOfObjects){ if(obj instanceof Ssortingng){ }else if(obj instanceof Integer){ }etc... } 
 import java.util.ArrayList; /** * @author potter * */ public class storeAny { /** * @param args */ public static void main(Ssortingng[] args) { // TODO Auto-generated method stub ArrayList anyTy=new ArrayList(); anyTy.add(new Integer(1)); anyTy.add(new Ssortingng("Jesus")); anyTy.add(new Double(12.88)); anyTy.add(new Double(12.89)); anyTy.add(new Double(12.84)); anyTy.add(new Double(12.82)); for (Object o : anyTy) { if(o instanceof Ssortingng){ System.out.println(o.toSsortingng()); } else if(o instanceof Integer) { System.out.println(o.toSsortingng()); } else if(o instanceof Double) { System.out.println(o.toSsortingng()); } } } } 

Appelez simplement .getClass() sur chaque Object dans une boucle.

Malheureusement, Java n’a pas map() . 🙂

L’instance de base fonctionne si vous ne dépendez pas de classes spécifiques, mais gardez également à l’esprit que vous pouvez avoir des valeurs NULL dans la liste.

Depuis Java 8

 mixedArrayList.forEach((o) -> { Ssortingng type = o.getClass().getSimpleName(); switch (type) { case "Ssortingng": // treat as a Ssortingng break; case "Integer": // treat as an int break; case "Double": // treat as a double break; ... default: // whatever } }); 

au lieu d’utiliser object.getClass().getName() vous pouvez utiliser object.getClass().getSimpleName() , car il renvoie un nom de classe simple sans nom de package.

par exemple,

 Object[] intArray = { 1 }; for (Object object : intArray) { System.out.println(object.getClass().getName()); System.out.println(object.getClass().getSimpleName()); } 

donne,

 java.lang.Integer Integer 

Vous dites “ceci est un morceau de code java en cours d’écriture”, d’où je déduis qu’il y a encore une chance que vous puissiez le concevoir d’une manière différente.

Avoir une ArrayList, c’est comme avoir une collection de choses. Plutôt que de forcer instanceof ou getClass à chaque fois que vous prenez un object dans la liste, pourquoi ne pas concevoir le système de manière à obtenir le type d’object lorsque vous le récupérez dans la firebase database et le stocker dans le type de object?

Vous pouvez également utiliser l’une des nombreuses bibliothèques d’access aux données existantes pour ce faire.

Si vous vous attendez à ce que les données soient numériques sous une forme quelconque et que tout ce qui vous intéresse, c’est de convertir le résultat en une valeur numérique, je suggérerais:

 for (Object o:list) { Double.parseDouble(o.toSsortingng); }