Java Generics: incompreensão de captura de curinga

Lendo o tutorial on-line do Java Não entendi nada sobre a captura de curingas. Por exemplo:

    import java.util.List;
    public class WildcardError {
     void foo(List<?> i) {
      i.set(0, i.get(0));
     }
    }

Por que o compilador não pode manter a atribuição segura? Ele sabe que, ao executar, por exemplo, o método com uma Integer List, obtém do i.get um valor Integer. Portanto, tente definir um valor Integer no índice 0 para a mesma lista Integer (i). Então, o que há de errado? Por que escrever um ajudante Wildcard?

questionAnswers(5)

yourAnswerToTheQuestion