2011-01-15 9 views
10

asumir un método con la siguiente firma:¿Cómo paso una ArrayList a un método que espera un vararg (Object ...)?

public static void foo(String arg1, String args2, Object... moreArgs); 

Cuando se ejecuta ...

ClassName.foo("something", "something", "first", "second", "third"); 

... Voy a moreArgs[0] == "first", moreArgs[1] == "second" y moreArgs[2] == "third".

Pero supongamos que tengo los parámetros almacenados en un ArrayList<String> llamado arrayList que contiene "primero", "segundo" y "tercero".

Quiero llamar foo modo que moreArgs[0] == "first", moreArgs[1] == "second" y moreArgs[2] == "third" utilizando el arrayList como parámetro.

Mi intento ingenuo era ...

ClassName.foo("something", "something", arrayList); 

... pero eso me dará moreArgs[0] == arrayList que no es lo que quería.

¿Cuál es la forma correcta de pasar arrayList con el método anterior para que foomoreArgs[0] == "first", moreArgs[1] == "second" y moreArgs[2] == "third"?

Tenga en cuenta que el número de argumentos en arrayList es tres en este caso específico, pero la solución que estoy buscando debe ser general y funcionar para cualquier número de argumentos en arrayList.

Respuesta

22

Convierta su ArrayList en una matriz de tipo objeto.

ClassName.foo("something", "something", arrayList.toArray());
+0

¡Oh, así de simple! ¡Pensé que Object ...! = Object []. ¡Gracias! :-) – knorv

+0

En general Object! = Object [], pero para los métodos varargs, el compilador convierte un parámetro MyType ... en un parámetro MyType [], y envuelve todos los argumentos en una matriz en tiempo de ejecución que pasa a la función. Entonces, en este caso, puede aprovechar la firma interna secreta del método varargs al pasar explícitamente una referencia de matriz. –

-1

Lo pasas como esperas. Sin embargo, hay una sola cosa, y es la referencia a ArrayList.

Luego tiene que cambiar sus cosas de la lista de arreglos.

+0

Solo puedo controlar el código que llama al método foo, por lo que cambiar el método foo no es una opción. – knorv

Cuestiones relacionadas