Quando você declara
public static <T> void foo(List<T>... bar)
o compilador o converte em
public static <T> void foo(List<T>[] bar)
então, para
public static void foo(List[] bar)
Em seguida, surge o perigo de atribuir valores incorretos à lista por engano e o compilador não acionará nenhum erro. Por exemplo, se T
for um String
, o código a seguir será compilado sem erros, mas falhará no tempo de execução:
// 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);
Se você revisou o método para garantir que ele não contenha tais vulnerabilidades, anote-o @SafeVarargs
para suprimir o aviso. Para interfaces, use @SuppressWarnings("unchecked")
.
Se você receber esta mensagem de erro:
O método Varargs pode causar poluição da pilha a partir do parâmetro varargs não reificável
e você tem certeza de que seu uso é seguro, você deve usá-lo @SuppressWarnings("varargs")
. Consulte @SafeVarargs uma anotação apropriada para este método? e https://stackoverflow.com/a/14252221/14731 para obter uma boa explicação desse segundo tipo de erro.
Referências: