varargs vararg una objetos lista ejemplos crear collection colecciones java collections language-features variadic-functions

una - ¿Por qué Java Varargs no soporta colecciones?



vararg kotlin (1)

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

Entonces, desde la perspectiva del Object... JVM Object... es más o menos lo mismo que el Object[] . Permitir colecciones también requeriría un cambio más invasivo a la JVM (que no tiene soporte explícito para colecciones hasta la fecha).

Tenga en cuenta que si desea admitir ambas formas, probablemente el mejor enfoque sea hacer el método basado en recopilación:

public void frobnicate(Object... args) { frobnicate(Arrays.asList(args)); } public void frobnicate(Iterable<Object> args) { // do stuff }

La razón de esto es que usar Arrays.asList() es generalmente una operación más barata que Collection.toArray() (porque crea un envoltorio simple).

En mi código Java a menudo uso el method(Class... args) muy práctico method(Class... args) varargs. Por lo que sé, te permiten pasar cualquier cantidad de objetos de Class o una matriz de Class[] . Como a menudo también uso 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 de tipo.

Entonces, ahora para la pregunta: ¿por qué Java no permite instancias de Iterable<T> como argumentos vararg, siempre que el tipo genérico se ajuste al tipo T... del vararg? ¿No todos usan listas, conjuntos, etc. todo el tiempo? ¿Existe una forma fácil y segura para escribir desde la colección a vararg?