OVH Cloud OVH Cloud

Questions à propos des génériques

5 réponses
Avatar
MiXAO
J'utilise Eclipse 3.1 M2.

J'ai écris cela :


private class Legume {

}

private class Carotte extends Legume {

}

et dans mon code :

ArrayList<Legume> list = new ArrayList<Legume>();
list.add(new Carotte());

Et ca compile !!
Est-ce normal ?

Dans ce tutorial: http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

Je vois qu'ils parlent des "Bounded Wildcard". (4.1, page 6).

public void drawAll(List<? extends Shape> shapes)

Dois-je moi aussi déclarer ma liste comme ceci pour que cela soit plus
propre ?

5 réponses

Avatar
KiLVaiDeN
"MiXAO" wrote in message
news:418ccc1c$0$5944$
J'utilise Eclipse 3.1 M2.

J'ai écris cela :


private class Legume {

}

private class Carotte extends Legume {

}

et dans mon code :

ArrayList<Legume> list = new ArrayList<Legume>();
list.add(new Carotte());

Et ca compile !!
Est-ce normal ?

Dans ce tutorial: http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

Je vois qu'ils parlent des "Bounded Wildcard". (4.1, page 6).

public void drawAll(List<? extends Shape> shapes)

Dois-je moi aussi déclarer ma liste comme ceci pour que cela soit plus
propre ?


Tu poses le doigt sur ce que l'on appelle le polymorphisme.

Une Carotte, peut se comporter comme un Legume, donc déclarer une variable
de "type" Legume, pour y mettre une instance de Carotte, n'a rien de
choquant.

Tu peux faire pareil avec n'importe quel variable de type Object (la
superclasse de Java):

Objet o = new Carotte();

Dans le même principe, imaginons que tu souhaites passer en paramètre d'une
méthode une ArrayList. Il est mieux de passer une variable de type
Collection, puis de traiter ton ArrayList avec les méthodes définie dans
"Collection" ( hasNext, next, iterator, etc ), ce qui aura pour avantage de
permettre une évolution le jour ou l'ArrayList ne fournira plus les
fonctionnalités que tu souhaites.

Ce cas est cependant différent car Collection est une interface. Il vaut
mieux que dans tes programmes tu cherches au maximum à transformer tes
dépendances de type héritage, en dépendances de type "interface". Si ta
classe Legume ne comporte que des méthodes, transforme la en Interface, ça
te permettra d'alléger les dépendances de ton programme et de le rendre plus
modulable par la suite.

Je te conseille de jeter un oeil sur l'utilisation des interfaces, c'est une
notion clé de la programmation Java.

K

Avatar
MiXAO
KiLVaiDeN wrote:
"MiXAO" wrote in message
news:418ccc1c$0$5944$

J'utilise Eclipse 3.1 M2.

J'ai écris cela :


private class Legume {

}

private class Carotte extends Legume {

}

et dans mon code :

ArrayList<Legume> list = new ArrayList<Legume>();
list.add(new Carotte());

Et ca compile !!
Est-ce normal ?

Dans ce tutorial: http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

Je vois qu'ils parlent des "Bounded Wildcard". (4.1, page 6).

public void drawAll(List<? extends Shape> shapes)

Dois-je moi aussi déclarer ma liste comme ceci pour que cela soit plus
propre ?



Tu poses le doigt sur ce que l'on appelle le polymorphisme.


Merci d'avoir pris la peine de me faire une réponse aussi longue mais je
connais le polymorphisme (mais pas beaucoup java) mais alors je précise
ma question; à quoi servent les bounded wildcard ?

MiXAO


Avatar
KiLVaiDeN
"MiXAO" wrote in message
news:418e9b90$0$32078$
KiLVaiDeN wrote:
"MiXAO" wrote in message
news:418ccc1c$0$5944$

J'utilise Eclipse 3.1 M2.

J'ai écris cela :


private class Legume {

}

private class Carotte extends Legume {

}

et dans mon code :

ArrayList<Legume> list = new ArrayList<Legume>();
list.add(new Carotte());

Et ca compile !!
Est-ce normal ?

Dans ce tutorial: http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

Je vois qu'ils parlent des "Bounded Wildcard". (4.1, page 6).

public void drawAll(List<? extends Shape> shapes)

Dois-je moi aussi déclarer ma liste comme ceci pour que cela soit plus
propre ?



Tu poses le doigt sur ce que l'on appelle le polymorphisme.


Merci d'avoir pris la peine de me faire une réponse aussi longue mais je
connais le polymorphisme (mais pas beaucoup java) mais alors je précise
ma question; à quoi servent les bounded wildcard ?

MiXAO


Dans ce cas je pense que la réponse à ta question se trouve dans le chapitre
3 du document que tu as fourni ( page 4 ), désolé de m'être trompé sur le
sens de ta question!

K



Avatar
Vincent Cantin
Merci d'avoir pris la peine de me faire une réponse aussi longue mais je
connais le polymorphisme (mais pas beaucoup java) mais alors je précise ma
question; à quoi servent les bounded wildcard ?

MiXAO


J'imagine que dans la class ArrayList, tu peux faire des choses differentes
si le type est "? extends Legume" et "Legume". Par exemple, tu peux
peut-etre faire des cast qui ne seront pas forcement non-checked (juste une
idee comme ca).

Avatar
Nico
"MiXAO" a écrit
Merci d'avoir pris la peine de me faire une réponse aussi longue mais je
connais le polymorphisme (mais pas beaucoup java) mais alors je précise
ma question; à quoi servent les bounded wildcard ?

MiXAO


Voila ce que j'en ai compris des bounded wildcards :

Dans ton cas, la classe Carotte dérive de la classe Legume mais
ArrayList<Carotte> ne dérive pas de ArrayList<Legume>.
Le résultat, c'est que si tu définis une méthode
"maMethode(ArrayList<Legume>)", tu ne pourras pas lui passer une
ArrayList<Carotte> car ce n'est pas une ArrayList<Legume>.
Par contre, si tu définis une méthode "maMethode(ArrayList<? extends
Legume>)", alors tu peux aussi bien lui passer une ArrayList<Legume> ou une
ArrayList<Carotte>.