6
votes

Ajout d'un objet à une liste générique avec deux types

J'ai lu quelques articles tels que ici mais je n'ai pas pu trouver la solution à mon problème.

Pourquoi je ne parviens pas à ajouter d? C'est un sous-type d'Objet ... Type de d: A>

List<A<B<?>>> rv=new LinkedList<>();
rv.add(new A<B<X>>());
rv.add(new A<B<String>>());
rv.add(new A<B<Integer>>());

EDIT

J'ai essayé pour simplifier le problème. Quand je fais:

 A<B<?>> abcv=new A<B<String>>();

J'obtiens l'erreur: Incompatibilité de type: impossible de convertir de A > en A > code>

Cependant, String est compatible avec "?" - alors pourquoi ça ne marche pas? Je veux ajouter des éléments à une liste où le dernier type peut par n'importe quoi, quelque chose comme ceci:

 List<A<B<? extends Object>>> rv=new LinkedList<>();
 rv.add(d); //not working


3 commentaires

Vous devez créer un objet de type A > . Cela devrait suffire. Qu'entendez-vous par «ne fonctionne pas»?


Vous ne pouvez pas garantir que ? extend Object peut contenir quelque chose de type X . Cela pourrait être autre chose comme A> .


Et notez que est identique à .


3 Réponses :


3
votes

d doit avoir le type A > ou compatible.


2 commentaires

Cependant, il n'aura jamais ce type exact, car le ? fera référence à différents types dans la déclaration de d et celle de la Liste ' s éléments.


@daniu oui. C'est pourquoi j'ai dit "ou compatible". J'aurais dû penser qu'il n'y a pas de d avec exactement le même type.



3
votes

List n'est pas un sous-type de List en Java. C'est pourquoi les jokers sont utilisés: List est un sous-type de List .

Maintenant, pour votre exemple A > abcv = new A > (); :

En ajoutant le caractère générique, vous faites de B un sous-type de B , mais comme ils sont également enveloppés par un autre type R , nous revenons au premier problème:
A> n'est pas un sous-type de A>
(Remarquez que B est la SuperClaz et B est la SubClaz dans ce cas).

Vous pouvez résoudre ce problème de la même manière; en ajoutant un autre caractère générique:
A > () est un sous-type de A > .

Gardez à l'esprit que cela ne vous permet pas de lire ou de manipuler la liste comme vous le souhaitez. Recherchez la covariance et la contravariance pour plus de détails. En voici une bonne: http://bayou.io/draft/Capturing_Wildcards.html < / p>


0 commentaires

2
votes
        List<Object> rv = new LinkedList<>();
        rv.add(new A<B<X>>());
        rv.add(new A<B<String>>());
        rv.add(new A<B<Integer>>());

0 commentaires