Re: [GENERIC] problème que je n'arrive pas à résoudre . P... de Generic :)
Hervé Agnoux <[email protected]> Mon, 24 Jan 2011 15:03:17 +0100
| Newsgroups | gmane.comp.java.french.general |
|---|---|
| Message-ID | <[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