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());