2012-09-21 24 views
16

Tengo una lista de matrices llena de elementos. Me gustaría pasar los elementos de esa lista de matriz como argumentos a una función variadica.Cómo pasar elementos de una lista de matriz a la función variadic

Mi función

public SequenceEntityModifier(final IEntityModifier... pEntityModifiers) 

Mi ArrayList

ArrayList<IEntityModifier> arr = new ArrayList<IEntityModifier>(); 
arr.add(new MoveXModifier(1, 50, 120)); 
arr.add(new MoveXModifier(1, 120, 50)); 

me gustaría pasarlo a la función como si iba a pasar a ellos individualmente.

new SequenceEntityModifier(/* elements of arr here */); 

¿Es esto posible?

Gracias de antemano.

Respuesta

21

Just Do:

new SequenceEntityModifier(arr.toArray(new IEntityModifier[arr.size()])); 

Esto copia el ArrayList a la matriz dada y lo devuelve. Todas las funciones vararg también pueden hacer arreglos para el argumento, por lo que para:

public void doSomething(Object... objs) 

todas las llamadas legales son:

doSomething(); // Empty array 
doSomething(obj1); // One element 
doSomething(obj1, obj2); // Two elements 
doSomething(new Object[] { obj1, obj2 }); // Two elements, but passed as array 

Una advertencia:

Vararg llama a la participación de las matrices primitivas don' t funciona como cabría esperar Por ejemplo:

public static void doSomething(Object... objs) { 
    for (Object obj : objs) { 
     System.out.println(obj); 
    } 
} 

public static void main(String[] args) { 
    int[] intArray = {1, 2, 3}; 
    doSomething(intArray); 
} 

Uno podría esperar que esto imprime 1, 2 y 3, en líneas separadas. En cambio, imprime algo así como [[email protected] (el resultado predeterminado toString para un int[]). Esto se debe a que es en última instancia, la creación de un Object[] con un elemento, que es nuestro int[], por ejemplo .:

// Basically what the code above was doing 
Object[] objs = new Object[] { intArray }; 

Lo mismo va para double[], char[], y otros tipos de matrices primitivas. Tenga en cuenta que esto se puede solucionar simplemente cambiando el tipo de intArray a Integer[]. Esto puede no ser simple si está trabajando con una matriz existente, ya que no puede convertir int[] directamente en Integer[] (vea this question, estoy particularmente interesado en los métodos ArrayUtils.toObject de Apache Commons Lang).

+1

Correcto, pero cada vez que escribo algo así me encoge: un enredo tan sintáctico. –

+0

perfecto, muchas gracias! – pad

+0

@SteveB.Estoy de acuerdo, la sobrecarga es una opción mucho mejor que forzar este tipo de llamada de método, luego convertir detrás de escena. Aunque los varargs son agradables, no juegan bien con las colecciones. – Brian

3

La construcción IEntityModifier... es el azúcar sintáctica para IEntityModifier[]

Ver las appropriate JLS section (8.4.1 parámetros formales)

3

siempre crean una sobrecarga que lleva Iterable< ? extends IEntityModifier >, y crea la versión variadic adelante a éste usando Arrays.asList(), que es barato.

+0

ahora puedo "una línea", ¡gracias! –

Cuestiones relacionadas