Hm ... pour répondre pleinement à votre question, un peu de fond est nécessaire:
Erasure signifie que les paramètres de type réel ne sont pas inclus dans le bytecode , et donc le type dynamique d'un paramètre de type est inconnu à l'exécution, ce qui rend généralement impossible de l'instancier. (Par conséquent, new T()
pour un paramètre de type T ne compile pas.)
Cependant, les paramètres de type réels spécifiés dans les déclarations de champs, de méthodes ou de classes sont enregistrés dans le fichier de classe et disponibles pour la réflexion. Dans certaines circonstances, cette dernière information est suffisante pour déterminer la valeur du paramètre de type.
Par exemple, l'extrait du site de mise en veille prolongée, si elle est déclarée en classe C<T>
, infère le type réel de T
si getClass()
est une sous-classe directe et non-générique de C
, en réfléchissant sur la clause EXTENDS de cette classe déclaration . (Si cette clause extends contenait cependant une autre variable de type comme dans class D<T> extends C<T>
, la méthode lançait une exception ClassCastException lors de la tentative de conversion d'une variable de type en Class<?>
).
S'il est possible de généraliser cet extrait pour tout getClass() direct ou non générique, mais si getClass() est générique, les informations limitées que l'exécution conserve sur les paramètres de type sont insuffisantes pour déterminer le type.
Pourquoi cette "question supprimée"? Comment peut-il aider les autres? –