Na seção de genéricos do Effective Java de Bloch (que é o capítulo "gratuito" disponível para todos: http://java.sun.com/docs/books/effective/generics.pdf ), ele diz:
Se um parâmetro de tipo aparecer apenas uma vez em uma declaração de método, substitua-o por um curinga.
(Veja as páginas 31-33 do pdf)
A assinatura em questão é:
public static void swap(List<?> list, int i, int j)
vs
public static void swap(List<E> list, int i, int j)
E, em seguida, passa a usar uma função "auxiliar" privada estática com um parâmetro de tipo real para executar o trabalho. A assinatura da função auxiliar é EXATAMENTE a da segunda opção.
Por que o curinga é preferível, pois você NÃO precisa usá-lo para concluir o trabalho? Entendo que, nesse caso, como ele está modificando a lista e você não pode adicionar a uma coleção com um curinga ilimitado, então por que usá-la?