Cuando declaras
public static <T> void foo(List<T>... bar)
el compilador lo convierte a
public static <T> void foo(List<T>[] bar)
luego a
public static void foo(List[] bar)
Entonces surge el peligro de que asigne por error valores incorrectos a la lista y que el compilador no active ningún error. Por ejemplo, si T
es un String
, el siguiente código se compilará sin error pero fallará en tiempo de ejecución:
// First, strip away the array type (arrays allow this kind of upcasting)
Object[] objectArray = bar;
// Next, insert an element with an incorrect type into the array
objectArray[0] = Arrays.asList(new Integer(42));
// Finally, try accessing the original array. A runtime error will occur
// (ClassCastException due to a casting from Integer to String)
T firstElement = bar[0].get(0);
Si revisó el método para asegurarse de que no contenga tales vulnerabilidades, puede anotarlo @SafeVarargs
para suprimir la advertencia. Para interfaces, use @SuppressWarnings("unchecked")
.
Si recibe este mensaje de error:
El método de Varargs podría causar contaminación del montón del parámetro de varargs no reificable
y está seguro de que su uso es seguro, entonces debería usarlo @SuppressWarnings("varargs")
. Consulte ¿Es @SafeVarargs una anotación adecuada para este método? y https://stackoverflow.com/a/14252221/14731 para obtener una buena explicación de este segundo tipo de error.
Referencias