Je souhaite créer un tableau de classes, chacune représentant un type disponible dans le système que je suis en train de créer. Toutes les classes concernées sont des sous-classes d'une superclasse commune. Donc, je voudrais faire:Comment utiliser des génériques avec un tableau de classes?
Class<? extends SuperClass>[] availableTypes = { SubClass1.class, SubClass2.class };
Cela me donne l'erreur:
Cannot create a generic array of Class<? extends SuperClass>.
Je reçois le même message si je tente de qualifier la création du tableau sur le côté droit de la initialisation:
Class<? extends SuperClass>[] availableTypes = Class<? extends SuperClass>[] { SubClass1.class, SubClass2.class };
je peux obtenir le code pour compiler si je gomment les qualifications génériques:
Class[] availableTypes = { SubClass1.class, SubClass2.class };
Mais alors je reçois l'avertissement génériques:
La classe est un type brut. Les références au type générique Class doivent être paramétrées.
J'essaie; J'essaie! :) Aussi, à ce stade, même si cela n'a pas provoqué d'avertissement, je perds une partie de l'interface que j'essayais de définir. Je ne veux pas retourner juste un tableau de classes arbitraires; Je veux retourner un tableau de classes qui sont toutes des sous-classes d'une SuperClasse particulière! Eclipse possède des outils assez puissants pour déterminer les paramètres à utiliser pour corriger les déclarations de génériques, mais dans ce cas, il tombe en panne, comme il a tendance à le faire lorsque vous traitez avec Class. La procédure "Infer Generic Type Arguments" proposée ne modifie en rien le code, laissant l'avertissement.
j'ai pu contourner ce problème en utilisant une collection à la place:
List<Class<? extends SuperClass>> availableTypes = new List<Class<? extends SuperClass>>();
Mais quelle est la bonne façon de le faire avec des tableaux?
Covariance! Vous avez dit le mauvais mot! –