Java génériques, obtenir de Classe<T> de paramètre générique
J'ai une classe abstraite:
public abstract class RootProcessor<T> {
Class<T> clazz;
}
J'ai besoin de remplir ClassT clazz;
avec les enfants de RootProcessor
- chaque enfant a son propre T
J'ai trouvé qu'une seule solution, mais il a besoin de compilateur argument -Xlint:unchecked
public RootProcessor(){
this.clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
Est-ce la meilleure solution? Peut-on faire la même chose sans -Xlint:unchecked
?
- N'utilisez pas de
-Xlint:unchecked
, utilisez@SuppressWarnings
le plus localement possible si vous avez besoin dangereux jette. - Et, oui, il n'y a aucun moyen d'obtenir
Class<T>
en toute sécurité lors de l'exécution si le compilateur ne peut pas suivre le type deT
du début à la fin. Le typesafe mais boilerplatey approche ici est tout simplement introduire une protégée constructeur qui prendclazz
en tant que paramètre. - Pourquoi n'avez-vous pas écrit que comme une réponse? J'ai très peu à ajouter à vos commentaires 😉
- oui, c'est une excellente réponse. Je pense que constructeur avec un paramètre est une excellente solution. Sa réponse simple à cette question )))
- À titre d'exemple:
key = gson.fromJson(json, key.getClass().getGenericSuperclass());
correctifskey = gson.fromJson(json,HashMap.class);
Vous devez vous connecter pour publier un commentaire.
La typesafe, mais boilerplatey façon de le faire est de passer le
Class<T>
jeton "où le compilateur peut le voir":Si vous êtes en train de faire un décoché cast, mais vous "savez ce que vous faites" et souhaitez le compilateur à arrêter de se plaindre, la bonne méthode serait la localisation de la non-type-safe-mais-vous-savez-ils-bits de travail et à l'aide de
@SuppressWarnings
:(Je ne vais pas tenir cette contre vous :P)
Il y a un post du même sujet: Reflétant les génériques
Et une classe que sa mise en oeuvre:TypeArgumentsUtils.java
Un exemple est dans le test de l'unité.
Donc si vous avez cette classe:
que vous obtenez le premier paramètre avec: