2011-06-10 25 views
8

¿Es posible almacenar una mezcla de tipos de objetos en una ArrayList? ¿Si es así, cómo?Java - ArrayLists mixto?

Esto es lo que he probado hasta ahora:

List<Object> list = new ArrayList<Object>(); 

list.add(new String("Hello World")); 
list.add(new Integer(1)); 
list.add(new Long(1l)); 

for (i = 0; i < list.size(); i++) { 
    if (list.get(i) instanceof String){ 
     sqlPreparedStatement.setString((i+1), (String) list.get(i)); 
    } else if (list.get(i) instanceof Integer) { 
     sqlPreparedStatement.setInt((i+1), (Integer) list.get(i)); 
    } else if (list.get(i) instanceof Long) { 
     sqlPreparedStatement.setLong((i+1), (Long) list.get(i)); 
    } 
} 

Pero emitirá una excepción de fundición.

¡Gracias de antemano por cualquier entrada!

+7

Definir "no funciona". –

+0

¿Por qué parametrizar con Object? ¿Qué obtienes con eso? – Jeremy

+7

@Jeremy: ¡Evita el molesto subrayado amarillo ondulado en Eclipse! –

Respuesta

18

Esto es lo que debe tener:

List<Object> list = new ArrayList<Object>(); 

list.add(new String("Hello World")); 
list.add(new Integer(1)); 
list.add(new Long(1l)); 

for (Object obj: list) { 
    if (obj instanceof String){ 
     sqlPreparedStatement.setString((String) obj); 
    } else if (obj instanceof Integer) { 
     sqlPreparedStatement.setInt((Integer) obj); 
    } else if (obj instanceof Long) { 
     sqlPreparedStatement.setLong((Long) obj); 
    } 
} 
+6

No hay necesidad de la "nueva Cadena()" por cierto. –

+2

@scientiaesthete: Además de List # get (int) al que se llama el doble de veces que en el suyo, y el uso de un iterador, no hay diferencia entre su fragmento de código y el OP. ¿Me estoy perdiendo algo aquí? ¿Cuál es la diferencia con respecto al casting? – bguiz

+1

@bguiz Las firmas setXXX() son diferentes. El OP tenía 'setXXX (int, XXXthing)', este solo tiene 'setXXX (XXXthing)'. Uno de ellos no coincide con la API, creo. – Atreys

10

sentimos a bloquear el desfile, pero no se debería usar un ArrayList de 3 (o cualquier otro) de diferentes tipos, para empezar. Si la información está relacionada, cree una clase que contenga la información relacionada y cree una ArrayList que contenga solo un tipo: objetos de esta clase.

Edición 1:
Por ejemplo decir una clase para contener los datos de este modo:

class SqlData { 
    private String textData; 
    private int intData; 
    private long longData; 

    public SqlData(String textData, int intData, long longData) { 
     this.textData = textData; 
     this.intData = intData; 
     this.longData = longData; 
    } 

    public String getTextData() { 
     return textData; 
    } 

    public int getIntData() { 
     return intData; 
    } 

    public long getLongData() { 
     return longData; 
    } 

} 

y se utiliza de esta manera:

List<SqlData> sqlDataList = new ArrayList<SqlData>(); 
    sqlDataList.add(new SqlData("Hello World", 1, 11L)); 

    for (int i = 0; i < sqlDataList.size(); i++) { 
    try { 
     sqlPreparedStatement.setString(i + 1, sqlDataList.get(i).getTextData()); 
     sqlPreparedStatement.setInt(i + 1, sqlDataList.get(i).getIntData()); 
     sqlPreparedStatement.setLong(i + 1, sqlDataList.get(i).getLongData()); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    } 
+2

Este enfoque es más descriptivo.Pero creo que no necesitamos un bucle 'sqlDataList' y' for' aquí. – Genzer

+0

+1 @Hovercraft: solo para contrarrestar el voto a favor de la "venganza" que probablemente obtuviste; Y también estoy de acuerdo en que no debes mezclar objetos de diferentes tipos dentro de una Lista en primer lugar; CON la posible excepción de tipos que son heredados (obedece la regla "is-a") – bguiz

+1

Aunque no debe mezclar objetos de diferentes tipos en una lista, eso no significa que las personas no puedan y que no haya software que tiene este tipo de código. – Atreys

4

Por qué estás haciendo esto tan difícil? PreparedStatement tiene un método setObject() - sólo tiene que utilizar lo siguiente:

List<Object> list = new ArrayList<Object>(); 
    list.add(new String("Hello World")); 
    list.add(new Integer(1)); 
    list.add(new Long(1l)); 
    for (int i = 0; i < list.size(); i++) 
     sqlPreparedStatement.setObject(i + 1, list.get(i)); // NOTE: columns count from 1 

NOTA: La API de Java SQL cuenta todo, desde 1, no desde cero, por lo que las columnas se numeran 1 ... tamaño() y no 0 ... size() - 1

Cuestiones relacionadas