En Java, ¿cómo puedo evitar los tipos brutos al llamar a getClass en una instancia de un tipo genérico?

Supongamos que tengo esto en Java:

List<String> list = new ArrayList<String>();
list.getClass();

El tipo de la última expresión esClass<? extends List>. Entiendo por qué, debido al borrado, no puede serClass<? extends List<String>>. Pero ¿por qué no puede ser?Class<? extends List<?>>?

¿No hay manera de evitar ambos?advertencias de yeso sin marcar yadvertencias de tipo crudo Si quiero asignar el resultado de esta expresión a una variable que de alguna manera mantiene la información de que esta clase es en realidad algún tipo deList?

Class<? extends List> listClass = list.getClass(); // raw type warning
Class<? extends List<?>> listClass = (Class<? extends List<?>>) list.getClass(); // unchecked cast warning

Respuestas a la pregunta(2)

Su respuesta a la pregunta