printItems("Hello", "World");
printItems(1, 2, 3, 4, 5);
printItems(1.1, 2.2, 3.3);
Cuidado com a poluição da pilha
Uma das principais preocupações ao usar varargs com genéricos é a poluição da pilha. A poluição da pilha ocorre quando o tipo parametrizado de uma variável não concorda com o tipo de objetos que aponta. Isso pode acontecer porque os argumentos de varargs são implementados como uma matriz e as matrizes em Java não têm a mesma especificidade de tipo que os genéricos. Por exemplo, considere este método:
public static void dangerous(List... lists) {
Object() objects = lists; // Implicit casting to Object array
objects(0) = Arrays.asList(1); // Assigning a List to a List array
T first = lists(0).get(0); // ClassCastException thrown here if T is not Integer
}
Neste exemplo, você pode passar List para o método, mas dentro do método, é possível inserir um Listlevando a um ClassCastException Quando você tenta recuperar um Integer Como se fosse um String.
Abordando a poluição da pilha com @safevarargs
Java 7 introduziu o @SafeVarargs Anotação para abordar a questão da poluição por heap. Esta anotação afirma que o método não executa operações potencialmente inseguras em seu parâmetro varargs. Ele deve ser usado somente quando o método estiver realmente seguro contra a poluição da pilha – isto é, não armazena nada na matriz de varargs genéricos ou faz qualquer coisa para torná -lo acessível ao código não confiável.
