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!