Détermination de la classe d'un type générique
Dans le domaine de la programmation générique, il peut être impératif de déterminer la classe du type générique étant utilisé. Cependant, comme c'est la nature des génériques, les informations de type sont généralement effacées au moment de l'exécution, ce qui présente un défi pour les récupérer ultérieurement.
Exemple :
Considérez le générique suivant class :
public class MyGenericClass<T> { public void doSomething() { // ... T bean = (T)someObject.create(T.class); // ... } }
Dans l'exemple ci-dessus, nous tentons de créer une instance de classe T en passant un littéral de classe. Cependant, cela entraînera une erreur « Littéral de classe illégal pour le paramètre de type T », car il est interdit de tenter d'utiliser le type générique comme littéral de classe.
Solution de contournement :
Pour surmonter ce défi, une solution de contournement viable consiste à transmettre la classe du type générique en tant que paramètre à une méthode statique. Cette méthode utilisera ensuite l'API de réflexion pour instancier le type générique.
public class MyGenericClass<T> { private final Class<T> clazz; public static <U> MyGenericClass<U> createMyGeneric(Class<U> clazz) { return new MyGenericClass<>(clazz); } protected MyGenericClass(Class<T> clazz) { this.clazz = clazz; } public void doSomething() { T instance = clazz.newInstance(); } }
En suivant cette approche, nous contournons la restriction interdisant l'utilisation de types génériques comme littéraux de classe, garantissant ainsi que les informations de type nécessaires sont disponibles au moment de l'exécution. . Bien qu'il s'agisse d'une solution peu élégante, elle offre un moyen de déterminer la classe d'un type générique dans un contexte difficile comme celui présenté dans l'exemple original.
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!