Maison  >  Article  >  Java  >  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
Susan Sarandonoriginal
2024-11-11 21:31:03849parcourir

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

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

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

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!

Déclaration:
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