2. Introduction
La programmation générique implique d'écrire du code qui puisse être
réutilisé pour des objets de types différents
écrire un code source unique utilisable avec des objets de types quelconques.
Nous n'avons plus besoin, par exemple, de programmer des classes
différentes pour collecter et gérer les objets des objets de n'importe quelle
classe.
Par exemple définir une classe permettant de manipuler des ensembles
d’objets de différentes classes.
11/12/2017 -A.Y- 2
3. Notion de classes génériques
Une classe générique est une classe comprenant un ou plusieurs attributs de type
paramétrable (classe paramétrée).
Une classe générique peut se présenter comme suit:
public class Couple <T> {
private T premier, deuxieme;
public Couple(){
premier=null;
deuxieme=null;
}
public Couple(T p1, T p2){
premier=p1;
deuxieme=p2;
}
11/12/2017 -A.Y- 3
public void afficher(){
System.out.println("Premier élément: "+premier
+"nDeuxième élément: "+deuxieme);
}
public T getPremier(){
return premier;
}
public void setPremier(T valeur){
premier=valeur;
}
}
Il s’agit d’une classe Couple qui modélise une paire de deux éléments du même type.
4. Notion de classes génériques
On note la présence d’un type générique nommé ici T (appelé aussi
paramètre de type) qui apparaît dans la déclaration de classe Couple.
Il sert à préciser que, dans la définition de classe T représente un type
quelconque.
Ce paramètre T peut alors être utilisé là où un type précis peut l’être
normalement.
Ici, on le rencontre dans les déclarations des attributs et dans l’entête de la
classe et ces méthodes.
11/12/2017 -A.Y- 4
5. Notion de classes génériques
Utilisation de la classe Couple:
Lors de la déclaration d’un objet de type Couple, on devra préciser le type
effectif correspondant à T, de cette manière :
Couple<Integer>ci;
Couple<String> cs;
La seule contrainte à respecter à ce niveau est que ce type doit
obligatoirement être une classe ; ainsi la déclaration suivante serait rejetée :
Couple <int> ci ; // erreur : int n’est pas une classe
L’appel du constructeur devra également préciser le type voulu.
cs = new Couple<String> (str1, str2) ;
11/12/2017 -A.Y- 5
6. Notion de classes génériques
Il est possible, au moment de la définition de la classe, d’imposer certaines
contraintes.
On peut par exemple imposer à la classe correspondant à un paramètre de
type d’être dérivée d’une classe donnée ou d’implémenter une ou plusieurs
interfaces.
class Couple <T extends Personne> {
// la définition précédente reste inchangée
}
Ici on impose au type désigné par T de dériver de la classe Personne, comme par
exemple Etudiant, Employe, ….
11/12/2017 -A.Y- 6
7. Notion de classes génériques
Remarques
On ne peut pas créer des tableaux d’éléments d’un type générique:
Couple <Point> courbe[]= new Couple<Point>[100];
Il est impossible de lever une exception (throw) à l’aide d’un objet d’une classe
générique : throw (Couple<String>) Erreur de compilation
Un attribut statique ne peut pas être d’un type paramétré :
static T minMax ;
11/12/2017 -A.Y- 7
8. Méthodes génériques
La même démarche peut s’appliquer aux méthodes.
On peut définir une seule méthode avec des paramètres de type; on parle
alors de "méthodes génériques".
Exemple:
class Tableau {
…
public static <T> T getMilieu(T[] tab) {
return tab[tab.length/2];
}
…
}
11/12/2017 -A.Y- 8
9. Méthodes génériques
il est possible d’imposer le type voulu pour T lors de l’appel de la méthode(Si
on veut davantage de vérifications à la compilation).
On utilise la syntaxe suivante :
NomClasse.<type>nomMethode().
Exemple:
String jours[]={"Lundi", "Mardi", …, "Dimanche"};
String jour= Tableau.getMilieu(jours);
//ou aussi Tableau.<String>getMilieu(jours);
11/12/2017 -A.Y- 9