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
TemplateClasset 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
Classcomme 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 leschampscommeList> et de convertir les valeurs enComparablele 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 votreTemplateClassutilise les champsminetmax.