La g n ricit
(dapr s le cours de Philippe GENOUD )
Cours de Programmation Orient e Objet Avanc e
ISET Bizerte
CHALOUAH Anissa
Anissa CHALOUAH
1
G n ricit : motivation
uSupposons que l'on d veloppe du code pour g rer une file d'attente
(FIFO First In First Out) et que l'on veuille utiliser ce code pour
wune file d'entiers
wune file de cha nes de caract res (String)
wune file d'objets Personne
w,,,,,,,,,,,,
Anissa CHALOUAH
2
G n ricit : motivation
u1 re solution : crire une classe pour chaque type de valeur que l'on peut mettre dans la file
class ElementInt {
private final int value;
private ElementInt next;
ElementInt(int val) {
this.value = val; next = null; }
void inserer(ElementInt elt) {
this.next = elt; }
int getValue() { return value; }
ElementInt getNext() { return next; }
}
public class FileAttenteInt {
private ElementInt t te = null;
private ElementInt queue = null;
public void ajouter(int val) {
ElementInt elt = new ElementInt(val);
if (estVide()) { t te = queue = elt; }
else { queue.inserer(elt); queue = elt;
} }
public boolean estVide() { return t te == null;}
public int retirer() {
int val = -1;
if (!estVide()) {
val = t te.getValue();
t te = t te.getNext();
}
return val; }
}
Anissa CHALOUAH
3
G n ricit : motivation
class ElementPersonne {
private final Personnevalue;
private ElementPersonne next;
Publicité
ElementPersonne(Personne val) {
this.value = val; next = null; }
void inserer(ElementPersonne elt) {
this.next = elt; }
int getValue() { return value; }
ElementPersonne getNext() { return next; }
; }
public class FileAttentePersonne {
private ElementPersonne t te = null;
private ElementPersonne queue = null;
public void ajouter(Personne val) {
ElementPersonne elt = new ElementPersonne(val
if (estVide()) { t te = queue = elt; }
else { queue.inserer(elt); queue = elt;
} }
public boolean estVide() { return t te == null
public int retirer() {
int val = -1;
if (!estVide()) {
val = t te.getValue();
t te = t te.getNext();
}
return val; }
}
Anissa CHALOUAH
4
G n ricit : motivation
u1 re solution : crire une classe pour chaque type de valeur que l'on peut mettre dans la
file
Duplication du code, source d'erreurs
l' criture et lors de modifications du
programme
N cessit de pr voir toutes les combinaisons
possibles pour une application
Anissa CHALOUAH
5
G n ricit : motivation
u2 me solution : utiliser un type "universel", Object en Java
class Element {
private final Object value;
private Element next;
Element(Object val) {
this.value = val; next = null;
}
void inserer(Element elt) {
this.next = elt; }
public Object getValue() {
return value; }
public Element getNext() {
return next; }
}
Publicité
public class FileAttente {
private Element t te = null;
private Element queue = null;
public void ajouter(Object val) {
Element elt = new Element(val);
if (estVide()) { t te = queue = elt; }
else { queue.inserer(elt); queue = elt; } }
public boolean estVide() { return t te == null;}
public Object retirer() {
Object val = null;
if (!estVide()) {
val = t te.getValue();
t te = t te.getNext();
}
return val; }
toute classe h ritant de Object, il est possible d'utiliser
FileAttente pour stocker n'importe quel type d'objet
}
Anissa CHALOUAH
6
G n ricit : motivation
u2 me solution : utiliser un type "universel", Object en Java
FileAttente f1 = new FileAttente();
f1.add(new Personne(...));
FileAttente f2 = new FileAttente();
f2.add(new Voiture(...));
Anissa CHALOUAH
7
G n ricit : motivation
FileAttente f1 = new FileAttente();
f1.ajouter(new Personne(...));
...
// on veut r cup rer le nom de la personne
// en t te de file.
String nom = (Personne)(f1.retirer()).getNom();
Transtypage
Object
f1.ajouter("Hello");
String nom = (Personne)(f1.retirer()).getNom();
ClassCastException
obligation pour le programmeur d'effectuer un
transtypage lorsquil acc de aux l ments de la
file d'attente
pas de contr le sur les valeurs rang es dans la
file d'attente
code lourd, moins lisible, plus difficile maintenir
risques derreurs dex cution.
Anissa CHALOUAH
8
G n ricit : motivation
uMais a, c' tait avant&
Publicité
udepuis la version 1.5 de java (Tiger), cela nest quun mauvais souvenir gr ce
lintroduction (enfin !) de la g n ricit dans le langage Java.
Anissa CHALOUAH
9
G n ricit : Principe
uLa g n ricit (ou polymorphisme param trique) permet de faire des abstractions sur
les types .
wutiliser des types (Classes ou Interfaces) pour param trer une d finition de classe ou d'interface
ou de m thode
wr utiliser le m me code avec des types de donn es diff rents.
uPr sente dans de nombreux langages de programmation avant introduction en Java :
Eiffel, Ada, C++, Haskell, ...
uPr sente dans le langage de mod lisation UML
Anissa CHALOUAH
10
uLes classes Element et FileAttente sont param tr es en fonction dun type formel T
wT est utilis comme type d'une ou plusieurs caract ristiques. Les classes manipulent des
informations de type T. Elles ignorent tout de ces informations.
Anissa CHALOUAH
11
Utilisation d'une classe g n rique simple
uLors de linstanciation de FileAttente<T> le type formel T est remplac par un type
(Classe ou Interface) existant
Le type est pass en argument
FileAttente<Personne> f1 = new FileAttente<Personne> ();
f1.add(new Personne(...));
FileAttente<Voiture> f2 = new FileAttente<> ();
f2.add(new Voiture(...));
Depuis la version Diamond (java 7),
on n'est pas oblig de mentionner les
arguments de type dans le
constructeur
Anissa CHALOUAH
12
Utilisation d'une classe g n rique simple
La g n ricit simplifie la programmation, vite de dupliquer du code et le rend plus robuste
Anissa CHALOUAH
13
Types G n riques Simples
uType g n rique : Classe ou interface param tr e par un ou plusieurs types
classe g n rique deux param tres
public class Paire<T1, T2> {
private final T1 first;
private final T2 second;
public Paire(T1 first, T2 second)
{
this.first = first;
this.second = second;
}
public T1 getFirst() { return
first; }
Publicité
public T2 getSecond() { return
second; }
}
Anissa CHALOUAH
Interface g n rique
public interface Comparable<T> {
int compareTo(T o);
}
14
Instanciation d'un type g n rique
uInstanciation (invocation) d'un type g n rique consiste valuer les param tres de type
uLes arguments de type (param tres effectifs) peuvent tre :
wdes classes(concr tes ou abstraites)
Paire<String, Forme> c1 = new Paire<>("Cercle 1",new Cercle(0,0,10));
wdes interfaces
Paire<String, IDessinable> c2 = new Paire<>("Visage 1", new VisageRond());
wdes types param tr s
Paire<String, Paire<String,Forme>> = new Paire<>("Paire 3",c1);
wdes param tres de type
public class FileAttente<E> {
private Element<E> t te = null;
...
Anissa CHALOUAH
15
Compilation de code g n rique
compilation de code g n rique
bas e sur le m canisme
d'effacement (erasure)
Anissa CHALOUAH
16
Cons quences de leffacement du type
u l'ex cution, il n'existe qu'une classe (le type brut) partag e par toutes les instanciations du
type g n rique
umais cela induit un certain nombre de limitations
wles membres statiques d'une classe param tr e sont partag s par toutes les instanciations de celle-ci
Anissa CHALOUAH
17
G n ricit : limitations
wLes membres statiques d'une classe param tr e ne peuvent pas utiliser ses param tres de type
wau sein d'une classe param tr e on ne peut pas utiliser les param tre de type pour instancier un
objet (simple ou tableau)
Anissa CHALOUAH
18
G n ricit : limitations
wSeul le type brut est connu lex cution:
wau sein d'une classe param tr e on ne peut pas utiliser les param tre de type pour instancier un
objet (simple ou tableau)
Anissa CHALOUAH
19