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

Laurent Forêt <[email protected]> Mon, 24 Jan 2011 15:36:59 +0100
Newsgroups gmane.comp.java.french.general
Message-ID <[email protected]>
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(new B());

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.

Merci à vous tous.

Laurent.


2011/1/24 Hervé Agnoux <[email protected]>

> Heu... c'est quoi la question ?
>
> Pour ton wrapper tu peux écrire :
>
> Wrapper<? extends A> wa = Wrappers.createWrapper(new B());
>
> ... ce qui posera peut être d'autres problèmes, mais attendons qu'ils
> arrivent.
>
> De Maven, Eclipse et Netbeans, je crois que c'est Maven qui a raison. Tu
> peux
> donc sans hésiter jeter Eclipse et Netbeans.
>
> D'une façon générale, il est malaisé de mélanger héritage de classe et
> "héritage" de générique.
>
> Le générique est bien adapté à une cohérence des déclarations et de
> l'écriture
> dans un bloc donné. Ça n'a pas de conséquence sur la classe utilisée au
> runtime.
>
> Donc, ici je te conseille d'écrire tout simplement :
>
> Wrapper<B> wa = Wrappers.createWrapper(new B());
>
> ... cela assurera que dans ton écriture tu es bien cohérent avec le fait
> que
> le wrapper est un wrapper de B. Aucun besoin d'être générique de chez
> générique et de mettre un A si c'est un B.
>
> S'il y a une raison qui justifie ton Wrapper<A>, c'est plus probablement
> une
> question d'héritage de classe, donc, soit ton générique est mal adapté,
> soit
> ta gestion d'héritage de classe est mal adapté. Comme tu fais du wrapper,
> c'est plus probablement l'héritage de classe que tu dois éviter ici.
>
> Heu... Suis-je clair moi non plus ?
>
>
>
>
> Le lundi 24 janvier 2011, Laurent Forêt a écrit :
> > Bonjour,
> >
> >   Comme c'est lundi et que je suis sympa, j'ai un petit casse tête sur
> les
> > génériques à vous proposer :
> >
> > Soit le code suivant :
> >
> > public class TestCreateWrapper {
> >
> >     @Test
> >     public void test() {
> >         *// POINT1*
> >         Wrapper<A> wa = Wrappers.createWrapper(new B());
> >     }
> >
> >     public static class A {}
> >
> >     public static class B extends A {}
> >
> >     public static class Wrapper<T> {
> >         private T t;
> >         public Wrapper(T t) {
> >             this.t = t;
> >         }
> >     }
> >
> >     public static class Wrappers {
> >         *//POINT2*
> >         public static <TODO> createWrapper(T t) {
> >             throw new UnsupportedOperationException("TODO");
> >         }
> >     }
> > }
> >
> > au POINT 2 je code rapidement ça :
> >
> >  public static <T> Wrapper<T> createWrapper(T t) {
> >      return new Wrapper<T>(t);
> >  }
> >
> > problème au POINT1 , je dois faire un cast (comme quand j'utilise des
> > collections) :  Wrapper<A> wa = Wrappers.createWrapper(*(A)*new B());
> >
> > Or ce cast, il me parait complètement inutile à l'usage et donc je dois
> me
> > gourer quelque et part donc pour la réécriture de mon POINT2 :
> >
> > public static <T, S extends T> Wrapper<T> createWrapper(S s) {
> >     return new Wrapper<T>((T)s);
> > }
> >
> > La Netbeans ne gueule plus et ne m'oblige pas à mettre ce cast Eclipse
> non
> > plus d'ailleurs, alors je me dis cool, j'ai la solution au problème et je
> > me dis que les génériques c'est quand même compliqué.
> >
> > Mais le pire c'est après que je lance mon test via mon super outil Maven,
> y
> > a le compilo, le même que celui utiliser par Netbeans (Eclipse j'aurai pu
> > comprendre il compile pas avec le même) qui m'injure :
> >
> > [ERROR]TestCreateWrapper.java:[14,46] incompatible types
> > found   : TestCreateWrapper.Wrapper<TestCreateWrapper.B>
> > required: TestCreateWrapper.Wrapper<TestCreateWrapper.A>
> >
> >
> > Alors là je me dis c'est ch... les generiques.
> >
> > Mais comme je suis sur de trouver quelqu'un super balèze sur les
> génériques
> > sur cette liste et qui va m'écrire :"RTFM, la JLS à la ligne untel te dit
> > que tu n'as qu'à faire comme ça." Déçu de ne pas avoir trouvé tout seul
> > mais content d'avoir ma soluce je repars dans mon taffe.
> >
> > Any help will be appreciated !
> >
> > Laurent Forêt
> > http://www.devcoop.fr,
> > http://laurentforet.org
> > IvyBeans Creator
> > Membre du JUG Bordeaux
>
>