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.