2011-08-01 39 views
41

En mi código de Java a menudo uso las muy útiles method(Class... args) varargs. Por lo que yo sé, le permiten pasar cualquier cantidad de objetos Class o una matriz de Class[]. Como también utilizo a menudo las clases de colección de Java, me siento frustrado por la falta de compatibilidad entre ambos. Como resultado, termino haciendo collection.toArray(), pero eso tiene algunos problemas de seguridad.¿Por qué Java varargs no admite colecciones?

Así que ahora para la pregunta: ¿por qué Java no permite casos de Iterable<T> como argumentos vararg, siempre que el tipo genérico se ajuste al tipo T... de la vararg? ¿No todos usan listas, conjuntos, etc. todo el tiempo? ¿Existe una forma sencilla y segura de proporcionar la conversión de colección a vararg?

Respuesta

48

La razón es simple: un parámetro arity variable es simplemente un parámetro de matriz de la vieja escuela con algunos metadatos adicionales que le dicen al compilador que proporcione algo de azúcar sintáctico (es decir, permite la creación implícita de matrices).

Por lo tanto, desde la perspectiva de la JVM Object... es prácticamente lo mismo que Object[]. Permitir colecciones también requeriría un cambio más invasivo a la JVM (que no tiene un apoyo explícito para las colecciones hasta la fecha).

Tenga en cuenta que si quieres apoyar en ambos sentidos, a continuación, haciendo el método basado en la colección es probablemente el mejor enfoque:

public void frobnicate(Object... args) { 
    frobnicate(Arrays.asList(args)); 
} 

public void frobnicate(Iterable<Object> args) { 
    // do stuff 
} 

La razón de esto es que el uso Arrays.asList() es generalmente una operación más barato que Collection.toArray() (porque crea una envoltura simple).

+0

Responde la pregunta desde un punto de vista técnico, pero como desarrollador, todavía creo que es una tontería proporcionar un método auxiliar siempre que quiera usar tanto colecciones como objetos simples. Por supuesto, el hecho de que tenemos colecciones y varargs ya es un alivio en comparación con hace algunos años. – tb189

+3

@The Elite Gentleman: Prefiero usar 'frobnicate' sobre un simple' foo'. [fuente] (http://www.catb.org/jargon/html/F/frobnicate.html). –

+0

@ tb189: ¿por qué un "método de ayuda"? Desea que un método acepte dos tipos de argumentos diferentes, no relacionados con el tipo de letra. Ese es * exactamente * el problema que la sobrecarga está diseñada para manejar. –

Cuestiones relacionadas