Pregunta

Tengo un ArrayList compuesto de diferentes elementos importados de un db, compuesto de cadenas de caracteres, números, dobles y enteros.Es allí una manera de utilizar una reflexión de tipo de técnica para averiguar lo que cada tipo de datos de cada elemento se mantiene?

FYI:La razón por la que hay tantos tipos de datos es que este es un fragmento de código java está escrito para ser implementado con diferentes DB.

¿Fue útil?

Solución

En C#:
Fija 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((Integer o).intValue());
    }
    else if (o instanceof String)) {
        handleString((String)o);
    }
    ...
}

Otros consejos

Usted puede utilizar el getClass() método, o puede utilizar 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á subclases.Por ejemplo, de C es una subclase de A, a continuación, el siguiente será verdad:

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

Sin embargo, el siguiente será falsa:

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

Casi nunca se quiere utilizar algo como:

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

porque tú no eres de contabilidad para posibles subclases.Usted realmente desea utilizar la Clase#isAssignableFrom:

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

En Java sólo utilizar el operador instanceof.Esto también se ocupará de las subclases.

ArrayList<Object> listOfObjects = new ArrayList<Object>();
for(Object obj: listOfObjects){
   if(obj instanceof String){
   }else if(obj instanceof Integer){
   }etc...
}
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());
            }
        }
    }
}

Solo llame .getClass() en cada Object en un bucle.

Por desgracia, Java no tiene map(). :)

Instanceof funciona si usted no dependen de clases específicas, pero también hay que tener en cuenta que usted puede tener valores null en la lista, por lo obj.getClass() fallará, pero instanceof siempre devuelve false null.

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 lugar de utilizar object.getClass().getName() puede utilizar object.getClass().getSimpleName(), porque devuelve un simple nombre de la clase sin un paquete de nombre incluido.

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

Usted dice "esto es un fragmento de código java está escrito", a partir de la cual deduzco que todavía hay una posibilidad de que usted podría diseñar de un modo diferente.

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

O, se puede utilizar una de las muchas bibliotecas de acceso de datos que existen para hacer esto para usted.

Si se espera que los datos sean numéricos en alguna forma, y todos los que están interesados en hacer es convertir el resultado en un valor numérico, yo sugeriría:

for (Object o:list) {
  Double.parseDouble(o.toString);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top