Capturando curingas em genéricos Java

Deisto Tutorial do Oracle Java:

O exemplo WildcardError produz um erro de captura quando compilado:

public class WildcardError {

    void foo(List<?> i) {
        i.set(0, i.get(0));
    }
}

Após essa demonstração de erro, eles corrigem o problema usando um método auxiliar:

public class WildcardFixed {
    void foo(List<?> i) {
        fooHelper(i);
    }

    // Helper method created so that the wildcard can be captured
    // through type inference.
    private <T> void fooHelper(List<T> l) {
        l.set(0, l.get(0));
    }
}

Primeiro, eles dizem que o parâmetro de entrada da lista (i) é visto como umObject:

Neste exemplo, o compilador processa oi parâmetro de entrada como sendo do tipo Object.

Porquê entãoi.get(0) não retorna umObject? se já foi passado como tal?

Além disso, qual é o ponto de usar um<?> quando então você tem que usar um método auxiliar usando<T>. Não seria melhor usar diretamenteT o que pode ser inferido?

questionAnswers(1)

yourAnswerToTheQuestion