Maison > Java > javaDidacticiel > Comment puis-je déterminer la classe d'un type générique au moment de l'exécution ?

Comment puis-je déterminer la classe d'un type générique au moment de l'exécution ?

Susan Sarandon
Libérer: 2024-11-11 21:31:03
original
884 Les gens l'ont consulté

How Can I Determine the Class of a Generic Type at Runtime?

Détermination de la classe d'un type générique

En programmation générique, il est souvent souhaitable d'accéder à la classe du type générique utilisé. Cependant, les informations de type générique sont effacées au moment de l’exécution, ce qui rend cette tâche intrinsèquement difficile. Cet article explore une solution de contournement efficace pour surmonter cette limitation.

Le défi

Considérez l'extrait de code suivant :

public class MyGenericClass<T> {
  public void doSomething() {
    T bean = (T)someObject.create(T.class);
  }
}
Copier après la connexion

Ce code tente de créez une instance de type T à l'aide de la méthode create d'une bibliothèque tierce, qui nécessite la classe réelle de T comme argument. Cependant, l'accès direct à T.class entraîne une erreur de littéral de classe illégale pour le paramètre de type T.

La solution de contournement

Étant donné que les informations de type générique sont effacées au moment de l'exécution, une alternative une approche est nécessaire. La solution de contournement suivante implique la création d'une méthode de fabrique statique qui accepte la classe du type générique comme argument :

public class MyGenericClass<T> {

    private final Class<T> clazz;

    public static <U> MyGenericClass<U> createMyGeneric(Class<U> clazz) {
        return new MyGenericClass<U>(clazz);
    }

    protected MyGenericClass(Class<T> clazz) {
        this.clazz = clazz;
    }

    public void doSomething() {
        T instance = clazz.newInstance();
    }
}
Copier après la connexion

Usage

Pour utiliser cette solution de contournement, créez un instance de MyGenericClass en utilisant la méthode d'usine createMyGeneric :

MyGenericClass<MyClass> genericInstance = MyGenericClass.createMyGeneric(MyClass.class);
Copier après la connexion

Cela permet d'accéder à la classe réelle du type générique via le clazz dans l'instance MyGenericClass.

Inconvénients

Bien que cette solution de contournement soit fonctionnelle, elle ajoute du code passe-partout à la solution. De plus, cela limite l'utilisation de méthodes ou de constructeurs génériques dans la méthode doSomething, car ils ne peuvent pas accéder directement aux informations de type générique.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal