Académique Documents
Professionnel Documents
Culture Documents
12 ProgrammationGenerique
12 ProgrammationGenerique
En Java
Programmation Générique 1
Objectifs
• Comprendre l’intérêt de la programmation générique
• Etre capable d’implémenter les classes et méthodes
génériques
• Connaître les limites de la programmation générique en
Java
• Comprendre la relation entre les types générique et
l’héritage
L. HASSOUNI 2
Programmation Générique 2
Classes paramétrées et génériques
• La classe ArrayList est une classe paramétrée
L. HASSOUNI 3
Programmation Générique 3
Avantages de la Généricité
import java.util.Date;
public class MyTest2 { Erreur à la
public static void main(String[] args) { compilation
Comparable<Date> c = new Date();
System.out.println(c.compareTo("red"));}}
L. HASSOUNI 4
Programmation Générique 4
ArrayList is a generic class since JDK 1.5.
L. HASSOUNI 5
Programmation Générique 5
1- Are there any compile errors in (a) and (b)?
L. HASSOUNI 6
Programmation Générique 6
Classes génériques (suite)
• Une classe définie avec un type paramètre est stockée dans un fichier
et compilée de la même manière que n’importe quelle classe.
• Une fois une classe paramètrée est compilée, elle peut être utilisée
comme n’importe quelle autre classe.
Programmation Générique 7
Définition d’une classe avec un type parameter(1)
public class Sample<T> { public class TestSample {
private T data; public static void main(String[] args)
// T est paramètre pour un type {
Sample<String> s = new Sample<>();
public void setData(T data){
s.setData("Bonjour");
this.data = data; System.out.println(s);
} }
public T getData(){ }
return data;
}
L. HASSOUNI 8
Programmation Générique 8
Définition d’une classe avec un type parameter(2)
public class Box<T> {
private T t;
public void add(T t) {
this.t = t;
}
public T get() {
return t;
}
public static void main(String[] args) {
Box<Integer> integerBox = new Box<Integer>();
Box<String> stringBox = new Box<String>();
integerBox.add(new Integer(10));
stringBox.add(new String("Hello World"));
L. HASSOUNI 9
Programmation Générique 9
Définition d’une classe avec un type paramètre (suite)
• Une classe définie avec un type paramètre est appelé classe
générique ou classe paramétrée.
• N’importe quel mot qui n’est pas un mot clé peut être
utilisé comme type paramètre, mais par convention, le
type paramètre commence par une lettre majuscule.
L. HASSOUNI 10
Programmation Générique 10
L’option de Compilation -Xlint
L. HASSOUNI 11
Programmation Générique 11
Définition d’une classe générique: Exemple
L. HASSOUNI 12
Programmation Générique 12
Définition d’une classe générique: Exemple(suite)
L. HASSOUNI 13
Programmation Générique 13
Utilisation d’une classe générique: Exemple
L. HASSOUNI 14
Programmation Générique 14
Utilisation d’une classe générique: Exemple(suite)
Program Output:
L. HASSOUNI 15
Programmation Générique 15
Le nom d’un constructeur générique n’a pas de type paramètre!!!
• Malgré que le nom d’une classe paramètrée est suivie par un type
parametre qui lui est attaché, le type parametre n’est pas utilisé dans
l’entête de la définition de son constructeur:
public Pair<T>()
• Un conctructeur peut utiliser le type parameter comme le type d’un
paramètre de ce constructor,mais dans ce cas les parentheses
angulaires ne sont pas utilsées:
public Pair(T first, T second)
• Cependant, lorsqu’une classe générique est instanciée, les
parenthèses angulaires sont utilisées:
Pair<String> pair = new Pair<String>("Happy", "Day");
L. HASSOUNI 16
Programmation Générique 16
Un type primitif ne peut pas correspondre à un type paramètre!!!
• Il ne peut pas être un type primitif tel que int, double, ou char
L. HASSOUNI 17
Programmation Générique 17
Limitations sur l’utilisation du type paramètre
L. HASSOUNI 18
Programmation Générique 18
Limitations sur l’instanciation d’une classe générique
• Les tableaux du type ci-dessous sont illégales:
Pair<String>[] a =
new Pair<String>[10];
L. HASSOUNI 19
Programmation Générique 19
Utilisation des Classes génériques et l’auto-boxing
L. HASSOUNI 20
Programmation Générique 20
Utilisation des Classes génériques et l’auto-boxing(suite)
Program Output:
L. HASSOUNI 21
Programmation Générique 21
Types Parametres multiples
L. HASSOUNI 22
Programmation Générique 22
Type Paramètres multiples (suite)
L. HASSOUNI 23
Programmation Générique 23
Type Paramètres multiples (suite)
L. HASSOUNI 24
Programmation Générique 24
Classes génériques et Exceptions
L. HASSOUNI 25
Programmation Générique 25
Utilisation d’une classe générique avec deux Types Paramètres
Program Output:
L. HASSOUNI 26
Programmation Générique 26
L. HASSOUNI 27
Programmation Générique 27
Limitation des types références correspondant à
un type paramètre
• Des fois il est souhaitable de limiter les types références
destinés à remplacer un type paramètre T.
•Par exemple, pour s’assurer que seules les
classes qui implémentent l’interface
Comparable sont utilisés pour remplacer le
type parametre T, il faut définir la classe comme
suit:
public class RClass<T extends Comparable>
• “extends Comparable" sert de frontière pour les
types références correspondant au type paramètre T.
• N’importe quel essai de remplacer le type T par un type
reference qui n’implémente pas l’interface
Comparable engendrera une erreur à la compilation.
L. HASSOUNI 28
Programmation Générique 28
Limitation des types références correspondant à un
type paramètre (suite)
• Une frontière du type paramètre peut être définie par le
nom d’une classe plus tôt que par le nom d’une interface
• Seules les sous classes de la classe frontière peuvent correspondre
au type parameter:
public class ExClass<T extends Class1>
L. HASSOUNI 29
Programmation Générique 29
Limitation des types références correspondant à un
type paramètre (suite)
L. HASSOUNI 30
Programmation Générique 30
Interfaces génériques
• Une interface peut avoir un ou plusieurs type paramètres.
• Les details et la notation sont les mêmes que pour une
classe avec des types paramètres.
L. HASSOUNI 31
Programmation Générique 31
Méthodes génériques
• Lorsqu’une classe générique est définie, le type paramètre
peut être utilisé dans les definitions des méthodes de cette
classe générique.
• En addition, une méthode générique peut être définie avec
ses propres types paramètres qui ne sont types paramètres
d’aucune classe
•Une méthode génerique peut être membre d’une
classe ordinaire ou membre d’une classe
génerique qui a un autre type paramètre.
•Le type paramètre d’une méthode génerique est
local à cette méthode, et non à la classe.
L. HASSOUNI 32
Programmation Générique 32
Méthodes génériques (suite)
• Le type parametre doit être placé entre parenthèses
angulaires après tous les modificateurs, et avant le type
de retour
public static <T> T genMethod(T[] a)
• Lorsqu’une méthode générique est invoquée, son nom est
préfixé avec le type reference correspondant au type
paramètre, mis entre parenthèses angulaire.
String s = NonG.<String>genMethod(c);
L. HASSOUNI 33
Programmation Générique 33
Exemple de méthode générique
import java.util.Arrays;
L. HASSOUNI 34
Programmation Générique 34
public static void main( String args[] ) {
// Create arrays of Integer, Double and Character
Integer[] intArray = { 5, 3, 2, 4, 1 };
Double[] doubleArray = { 3.3, 2.2, 4.4, 1.1 };
Character[] charArray = { 'F', 'B', 'A', 'C', 'E', 'D'};
Programmation Générique 35
public class Pair<K, V> {
private K key;
private V value;
public Pair(K key, V value) {
this.key = key;
this.value = value;
}
public void setKey(K key) { this.key = key; }
public void setValue(V value) { this.value = value; }
public K getKey() { return key; }
public V getValue() { return value; }
}
L. HASSOUNI 36
Programmation Générique 36
public class TestGenericMethod {
L. HASSOUNI 37
Programmation Générique 37
Exemple de méthode générique avec limitation de type
public class MaximumTest{
// determines the largest of three Comparable objects
public static <T extends Comparable<T>> T maximum(T x, T y, T z){
T max = x; // assume x is initially the largest
if ( y.compareTo( max ) > 0 ){
max = y; // y is the largest so far
}
if ( z.compareTo( max ) > 0 ){
max = z; // z is the largest now
}
return max; // returns the largest object
}
public static void main( String args[] ){
System.out.printf( "Max of %d, %d and %d is %d\n\n",
3, 4, 5, maximum( 3, 4, 5 ) );
L. HASSOUNI 38
Programmation Générique 38
Exemple de méthode générique avec un nombre variable
d'arguments
public class MinimumTest{
public static <T extends Comparable<T>> T minimum(T... x){
T min = x[0]; // assume x is initially the largest
for (T elemnent : x)
if ( elemnent.compareTo( min ) < 0 ){
min = elemnent; // y is the largest so far
}
return min; // returns the smallest object
}
public static void main( String args[] ){
System.out.printf( "Min of %d, %d and %d is %d\n\n",
3, 4, 5, minimum( 3, 4, 5 ) );
Programmation Générique 39
Héritage et classes génériques
• Une classe générique peut être définie comme une sous-
classe d’une classe ordinaire ou d’une autre classe
générique
•Comme avec une classe ordinaire, un objet
instance d’une sous classe est aussi instance de
la superclasse
• Etant données deux classes: A et B, et étant donnée G:
une classe générique, il n’ya aucune relation entre G<A>
et G<B>
•Ceci est vrai quelque soit la relation qui peut
exister entre les classes A et B, même si la
classe B est une sous-classe de la classe A
L. HASSOUNI 40
Programmation Générique 40
Classe générique dérivée: Exemple
L. HASSOUNI 41
Programmation Générique 41
Classe générique dérivée: Exemple (Suite)
Program Output:
L. HASSOUNI 42
Programmation Générique 42