Por ejemplo, foo()
no es seguro, se puede almacenar no-T en la matriz, causando un problema en [2]
<T extends List<?>> void foo(T... args)
{
List<String>[] array2 = (List<String>[])args;
array2[0] = a_list_of_string;
}
void test2()
{
List<Integer>[] args = ...; // [1]
foo(args);
Integer i = args[0].get(0); // [2]
}
Al marcar el método con @SafeVarargs, Prometes compilador que usted está no haciendo nada malo así.
Pero, ¿cómo diablos podemos obtener una matriz genérica en [1] para empezar? ¡Java no permite la creación genérica de matrices!
La única manera sancionada de creación de la matriz genérica es cuando se llama a un método vararg
foo(list_int_1, list_int_2)
entonces la matriz no es accesible a la persona que llama, la persona que llama no puede hacer [2] de todos modos, no importa cómo foo()
se ensucia con la matriz.
Pero entonces se piensa en ello, se es la puerta trasera para crear matriz genérica
@SafeVarargs
static <E> E[] newArray(int length, E... array)
{
return Arrays.copyOf(array, length);
}
List<String>[] array1 = newArray(10);
y la matriz genérica literal
@SafeVarargs
static <E> E[] array(E... array)
{
return array;
}
List<String>[] array2 = array(list1, list2);
Así que puede crear matriz genérica después de todo. .. Java tonto, tratando de evitar que hagamos eso.
Puede crear matrices genéricas sin métodos varargs, pero tiene que usar [Array # newInstance (clase > tipo, int length)] (http://tinyurl.com/3uzbb7v) y convertirlo. Gracias por la respuesta completa. – Jeffrey
No es realmente una "simplificación", sino una sugerencia mejorada. –
Estoy intentando este ejemplo y no veo ningún cambio en el comportamiento con y sin usar @SafeVarargs. Sigo recibiendo una advertencia "Tipo de seguridad: una matriz genérica de la lista ...." –
excalibur