4
votes

Définissez le type de modèle T au moment de l'exécution en passant une variable

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; 
}

Modifier

Voici la TemplateClass :

final List<TemplateClass> fields = new ArrayList<>();

public void loadDataFields() {
    for(Field x : ClassA.class.getDeclaredFields()) {
        fields.add(new TemplateClass<x.getClass()>());
    }
}


2 commentaires

Pouvez-vous peut-être montrer votre classe TemplateClass et comment elle utilise le paramètre de type T ? 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 les champs comme List> et de convertir les valeurs en Comparable le cas échéant (impossible d'éviter le type brut) - (pour éviter les exceptions de conversion de classe, vous devriez peut-être vérifier if (Comparable.class.isAssignableFrom (x.getType ())) ). Le reste dépend de la manière dont votre TemplateClass utilise les champs min et max .


3 Réponses :


3
votes

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.


0 commentaires

2
votes

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.


0 commentaires

2
votes

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.


0 commentaires