Est-il possible de passer une variable Class
lors de l'instanciation d'une nouvelle classe de modèle nommée TemplateClass
ou est-ce absolument non sens? aime faire mais qui ne compile pas:
public class TemplateClass<T extends Comparable> { int count; T min; T max; }
Voici la TemplateClass
:
final List<TemplateClass> fields = new ArrayList<>(); public void loadDataFields() { for(Field x : ClassA.class.getDeclaredFields()) { fields.add(new TemplateClass<x.getClass()>()); } }
3 Réponses :
En Java, les génériques sont évalués comme des informations de compilation (principalement) dues à Tapez Effacement .
La ligne new TemplateClass
n'a aucun sens car x.getClass ()
n'est évalué qu'au runtime. Cette ligne entraînerait une erreur de compilation.
Vous ne pouvez pas attribuer un Type
en tant que classe générique au moment de l'exécution.
Les génériques ne peuvent être utilisés que au moment de la compilation.
En bref - Non.
Il n'y a aucun moyen d'instancier un modèle avec une classe dynamique au moment de l'exécution. En effet, les modèles sont évalués au moment de la construction.
Pouvez-vous peut-être montrer votre classe
TemplateClass
et comment elle utilise le paramètre de typeT
? Cela peut aider quelqu'un à suggérer une solution viable.Comme les réponses le mentionnent, vous ne pouvez pas utiliser une expression de valeur
Class
comme paramètre de type concret. Étant donné que vos champs peuvent avoir différents types de données, le mieux est peut-être de déclarer leschamps
commeList>
et de convertir les valeurs enComparable
le cas échéant (impossible d'éviter le type brut) - (pour éviter les exceptions de conversion de classe, vous devriez peut-être vérifierif (Comparable.class.isAssignableFrom (x.getType ()))
). Le reste dépend de la manière dont votreTemplateClass
utilise les champsmin
etmax
.