2017-08-14 1 views
0

Je travaille actuellement sur des sujets de réflexion et je suis juste un débutant.De la classe <? extends X> à X

J'ai obtenu ceci:

List<X> list; 
Set<Class<? extends X>> set; 

Et je veux faire quelque chose comme ceci:

for (Class<? extends X> classx : set) list.add(classx); 

Mais je ne pouvais pas trouver quoi que ce soit sur la façon d'y parvenir. Quelqu'un peut-il m'aider?

+3

«X» et «Classe » sont des types très différents. Comme écrit, vous devez au moins créer une nouvelle instance de 'Class ' en utilisant la réflexion. Est-ce que votre question sur la façon de créer une instance lorsque vous avez un 'Class '? –

+0

Copie possible de [Création d'une instance à l'aide du nom de classe et du constructeur appelant] (https://stackoverflow.com/questions/6094575/creating-an-instance-using-the-class-name-and-calling-constructor) –

Répondre

0

Vous ne pouvez pas obtenir un tel comportement avec ces données d'entrée. List<X> liste attendait l'instance de classe X, mais vous essayez d'ajouter l'objet de type Class<? extends X>. Imaginons que le type X est Number (pour simplifier), nous avons Double, Integer, Character et etc, children of Number. Donc, vous faites la prochaine chose: Vous voulez ajouter l'objet de type Class<Integer> à la liste qui ne peut contenir que des numéros (pas un Class<Integer>, Class<Double> et ainsi de suite). La seule chose que vous pouvez faire, il est créer l'instance de Class<Integer>, Class<Double> cette façon, en utilisant la réflexion:

List<X> list = //some values; 
Set<Class<? extends X>> set = //some values; 
for (Class<? extends X> classx : set) list.add(classx.newInstance()); 

Mais qui est si mauvaise idée d'utiliser la réflexion de telle manière. Peut-être que vous vouliez dire quelque chose ceci:

List<Class<X>> list = //some values; 
Set<Class<? extends X>> set = //some values; 
for (Class<? extends X> classx : set) list.add(classx); 

Parce que toujours le Class<X> n'est pas la même chose que Class<? extends X>. Mais peut-être que vous vouliez dire quelque chose comme ceci:

List<X> list = //some values; 
Set<? extends X> set = = //some values; 
for (X elem : set) list.add(elem); 

un dernier air sympa et cela devrait fonctionner.

+0

Mais j'ai besoin d'avoir une liste car j'ai besoin d'invoquer des méthodes sur ces objets. Avoir un Set est exactement ce que j'essaie d'obtenir. –

+0

@ MaëlGrivot alors, laissez-moi poser quelques questions. Tout d'abord: avez-vous vraiment Set > ensemble, peut-être vous avez Set ensemble? Si 1 variante - tout d'abord vous devez instancier vous Classe parce que dans la variable Java Classe someVar est l'objet de type Classe (appelons-le Class Object), pas la même chose que l'objet de type? extends X. Les objets de classe ont des méthodes de réflexion (exemple newInstance() - qui crée à partir de cet objet de classe - l'objet de type spécifié entre parenthèses.) –

+0

Oui J'ai un Set > qui contient une liste des classes qui étend une classe abstraite. –