Re: [GENERIC] problème que je n'arrive pas à résoudre . P... de Generic :)

Rémi Forax <[email protected]> Mon, 24 Jan 2011 15:48:43 +0100
Newsgroups gmane.comp.java.french.general
Message-ID <[email protected]>
On 01/24/2011 03:36 PM, Laurent Forêt wrote:
> C'est le compilo utiliser par Maven qui à raison, mais c'est tout de 
> même bizarre que Netbeans avec le même ne me crache pas d'erreur.
>
> Effectivement a priori ma hiérarchie à l'air mal à propos. Mais dans 
> mon cas réel (car j'avais dégrossi et simplifié) A est une interface 
> et B un enum . Donc je déclare un wrapper d'interface et je construis 
> un wrapper d'enum. Or je ne veux pas exposer à ma classe utilisatrice 
> mon enum, je ne peux donc pas écrire tout simplement :
> Wrapper<B> wa = Wrappers.createWrapper(new B());
>
> Finalement, je retiens la solution la plus élégante comme étant celle là :
> Wrapper<A> wBenA = WrapperFactory.<A>newInstance(newB());
>
> Mais je trouve tout de même ça lourd, mais bon les génériques sont 
> ainsi fait et il y a une raison que je comprends. Vivement la next Big 
> JVM Language.

J'aurais du donner une explication.
Lorsque tu écris:
Wrapper<A> wa = Wrappers.createWrapper(new B());

comme Wrappers.createWrapper est une métode generics, tu demandes au 
compilo d'inférer, de trouver T.
L'algo spécifié par la JLS ne regarde que le types des paramètres (ici 
new B) et pas le type de retour
(Wrapper<A>). Donc il trouve T=B.

En fait, l'algo regarde le type de retour si le type des paramètres ne 
lui donne aucune indication,
c'est pour cela que le code suivant compile:

List<String> l = Collections.emptyList();

Donc comme le compilo arrive pas à trouver T, on peut lui indiquer T au 
lieu de lui demander de la trouver.
c'est exactement ce que fait:

Wrapper<A> wa = Wrappers.<A>createWrapper(new B());

Il est prévu de changer cette algo pour la 1.8 car il faudra un algo un 
peu plus malin pour résoudre les lambdas.

>
> Merci à vous tous.
>
> Laurent.

Rémi