Java: getClass () de tipo acotado

Noté algo mientras estaba divagando con genéricos. En el siguiente ejemplo,doStuff1 compila perodoStuff2 no hace

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();
}

Por lo tanto, busqué la documentación paraObject.getClass() y encontré esto:

El tipo de resultado real es Clase <? se extiende | X |> donde | X | es el borrado del tipo estático de la expresión en la que se llama a getClass.

Esto me dio un poco de curiosidad. Por que esgetClass() diseñado de esta manera? Puedo entender la conversión de tipos a sus clases en bruto, si corresponde, pero no veo ninguna razón obvia por la que necesariamente tendrían que hacerlo también.T. ¿Hay alguna razón específica por la que también se deshaga de él o es simplemente un enfoque general de "deshacámonos de todo porque es más fácil; quién lo necesitaría de todos modos"?

Respuestas a la pregunta(4)

Su respuesta a la pregunta