Java: getClass () do tipo limitado

Eu notei algo enquanto andava por aí com genéricos. No exemplo abaixo,doStuff1 compila masdoStuff2 não faz:

public <T extends Foo> void doStuff1(T value) {
    Class<? extends Foo> theClass = value.getClass();
}

public <T extends Foo> void doStuff2(T value) {
    Class<? extends T> theClass = value.getClass();
}

Então, eu procurei a documentação paraObject.getClass() e encontrei isto:

O tipo de resultado real é Classe <? estende | X |> onde | X | é o apagamento do tipo estático da expressão na qual o getClass é chamado.

Isso me deixou um pouco curioso. Por que égetClass() projetado dessa maneira? Eu posso entender a conversão de tipos para suas classes brutas, se aplicável, mas não vejo nenhuma razão óbvia para que eles tenham que fazer isso também matarT. Existe uma razão específica pela qual ele também se livra disso, ou é apenas uma abordagem geral "vamos nos livrar de tudo porque é mais fácil, quem precisaria disso de qualquer maneira"?

questionAnswers(4)

yourAnswerToTheQuestion