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

Régis <[email protected]> Mon, 24 Jan 2011 13:34:38 +0100
Newsgroups gmane.comp.java.french.general
Message-ID <[email protected]>

Salut,

Les génériques c'est facile tant qu'on ne rentre pas dans
les problèmes de génériques ;) 
Il ne faut pas oublier qu'en Java
c'est implémenté surtout par de la substitution du code.

Les classes
Wrapper et Wrapper qui sont générées à la compilation sont
considéré comme des sous-classes de Wrapper.
Et Wrapper n'hérite en
aucune manière de Wrapper, d'où le message d'erreur qui est tout à
fait normal.

Dans les lignes suivantes tu as un exemple des typages
possible dans ton cas.

public class Test {
 static class Wrapper {

private T value;
 Wrapper(T value) {
 this.value = value;
 }

 T
getValue() {
 return value;
 }
 }

 static class WrapperFactory {

static  Wrapper newInstance(T value) {
 return new Wrapper(value);
 }

}
 static class A {
 }
 static class B extends A {
 }
 static class C {

}

 public static void main(String[] args) {
 Wrapper wBenA =
WrapperFactory.newInstance(new B()); // (1)
 Wrapper wB =
WrapperFactory.newInstance(new B()); // (3)
 Wrapper wCenA =
WrapperFactory.newInstance(new C()); // (4)
 }
}

1) => en fait c'est
une manière plus élégante de faire le "cast", B est bien un A donc
ça passe, toutefois c'est un Wrapper que tu récupères.
2) => ici
aussi ça marche car B étend A.
3) => Wrapper est bien un Wrapper
4) =>
C n'est pas un A donc erreur.

En Java l'a partie gauche de
l'affectation n'est pas prise en compte lors de la "materialisation" du
type générique, il faut qu'il y ait assez d'information de type lors
de l'invocation de newInstance(). 

On Mon, 24 Jan 2011 11:35:49 +0100,
Laurent Forêt wrote:
> 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 wa =
Wrappers.createWrapper(new B()); 
> }
> 
> public static class A {}
> 
>
public static class B extends A {}
> 
> public static class Wrapper {
>
private T t; 
> public Wrapper(T t) {
> this.t = t;
> }
> }
> 
> public
static class Wrappers {
> //POINT2
> public static createWrapper(T t) {

> throw new UnsupportedOperationException("TODO");
> }
> }
> }
> 
> au
POINT 2 je code rapidement ça : 
> 
> public static Wrapper
createWrapper(T t) { 
> return new Wrapper(t);
> }
> 
> problème au
POINT1 , je dois faire un cast (comme quand j'utilise
> des collections)
: Wrapper 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 Wrapper createWrapper(S s) { 
> return new
Wrapper((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
> required: TestCreateWrapper.Wrapper 
> 
>
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 [1], 
> http://laurentforet.org [2]
> IvyBeans
Creator
> Membre du JUG Bordeaux
> 
> 
> Links:
> ------
> [1]
http://www.devcoop.fr
> [2] http://laurentforet.org

 Wrapper wB =
WrapperFactory.newInstance(new B());