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 de T du début à la fin. Le typesafe mais boilerplatey approche ici est tout simplement introduire une protégée constructeur qui prend clazz 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()); correctifs key = gson.fromJson(json,HashMap.class);