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 > >