objetos metodos llenar listas imprimir enteros elementos como agregar java generics reflection arraylist

metodos - listas en java



¿Cómo averiguo qué tipo es cada objeto en una ArrayList<Object>? (12)

Cª#:
Reparado con la recomendación 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 instanceof Integer)) { handleInt((int)o); } else if (o instanceof String)) { handleString((String)o); } ... }

Tengo un ArrayList compuesto de diferentes elementos importados de un db, compuesto de cadenas, números, dobles y enteros. ¿Hay alguna manera de utilizar una técnica de tipo de reflexión para averiguar qué tipo de datos contiene cada elemento?

FYI: La razón por la que hay tantos tipos de datos es que se trata de una pieza de código java que se está escribiendo para implementarse con diferentes DB.


Casi nunca quieres que uses algo como:

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

porque no estás contabilizando posibles subclases. ¿De verdad quieres usar Class # isAssignableFrom:

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


Desde Java 8

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


En Java simplemente use el operador instanceof. Esto también se encargará de las subclases.

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


La instancia de funciona si no depende de clases específicas, pero también debe tener en cuenta que puede tener nulos en la lista, por lo que obj.getClass () fallará, pero instanceof siempre devuelve falso en nulo.


Puede usar el método getClass() o puede usar instanceof. Por ejemplo

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

o

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

Tenga en cuenta que instanceof coincidirá con las subclases. Por ejemplo, de C es una subclase de A , entonces la siguiente será verdadera:

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

Sin embargo, lo siguiente será falso:

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


Si espera que los datos sean numéricos de alguna forma, y ​​todo lo que le interesa hacer es convertir el resultado en un valor numérico, sugeriría:

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


Simplemente llame a .getClass() en cada Object en un bucle.

Desafortunadamente, Java no tiene map() . :)


Usted dice "esto es una pieza de código java que se está escribiendo", de lo cual infiero que todavía hay una posibilidad de que pueda diseñarlo de otra manera.

Tener un ArrayList es como tener una colección de cosas. En lugar de forzar la instancia de getClass cada vez que toma un objeto de la lista, ¿por qué no diseñar el sistema para que obtenga el tipo de objeto cuando lo recupera de la base de datos y almacenarlo en una colección del tipo apropiado de ¿objeto?

O bien, podría usar una de las muchas bibliotecas de acceso a datos que existen para hacer esto por usted.


en lugar de usar object.getClass().getName() puede usar object.getClass().getSimpleName() , porque devuelve un nombre de clase simple sin incluir un nombre de paquete.

por ejemplo,

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

da,

java.lang.Integer Integer


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


import java.util.ArrayList; /** * @author potter * */ public class storeAny { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<Object> anyTy=new ArrayList<Object>(); anyTy.add(new Integer(1)); anyTy.add(new String("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 String){ System.out.println(o.toString()); } else if(o instanceof Integer) { System.out.println(o.toString()); } else if(o instanceof Double) { System.out.println(o.toString()); } } } }