2011-10-22 34 views
15

En Java 7, tiene la opción de poner una anotación @SafeVarargs para suprimir la advertencia que se obtiene al compilar un método con un parámetro varargs no reificable. El proposal de Project Coin estipula que la anotación se debe usar cuando el método asegura que solo los elementos del mismo tipo que el parámetro varargs se almacenan en la matriz varargs.Invocación simplificada del método Varargs en Java 7

¿Cuál sería un ejemplo de método no seguro?

Respuesta

21

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.

+1

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

+0

No es realmente una "simplificación", sino una sugerencia mejorada. –

+0

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

Cuestiones relacionadas