Dans le domaine de la programmation générique, il devient souvent crucial de déterminer la classe spécifique du type générique actuellement utilisé. utiliser. Cependant, le mécanisme générique d'effacement de type de Java pose un défi à cette entreprise.
Pour résoudre ce problème, examinons un exemple qui imite un scénario du monde réel :
public class MyGenericClass<T> { public void doSomething() { // Imagine a 3rd party library call that expects a Class object T bean = (T) someObject.create(T.class); } }
Malheureusement, le Le code ci-dessus échouera avec une erreur « Littéral de classe illégal pour le paramètre de type T ». En effet, les informations de type générique sont effacées au moment de l'exécution, rendant impossible l'utilisation directe de T.class.
Alors, comment pouvons-nous surmonter cet obstacle ? Une solution de contournement est apparue comme une solution viable : l'introduction d'une méthode de fabrique statique qui accepte la classe souhaitée comme paramètre.
public class MyGenericClass<T> { private final Class<T> clazz; public static <U> MyGenericClass<U> createMyGeneric(Class<U> clazz) { return new MyGenericClass<>(clazz); } private MyGenericClass(Class<T> clazz) { this.clazz = clazz; } public void doSomething() { T instance = clazz.newInstance(); } }
Cette approche vous permet de spécifier explicitement la classe générique lors de la création de l'objet, en contournant efficacement l'effacement à l'exécution. problème. Cependant, cela présente un inconvénient : cela ajoute du code passe-partout et complique légèrement l'API. Cela reste néanmoins une solution de contournement efficace lorsque la détermination du type de classe est indispensable.
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!