La généricité permet de définir des classes, ou des méthodes paramétrées par une ou plusieurs autres classes.
public class
Paire {
Object premier ;
Object second;
public Paire (Object a, Object b){
premier
a; second = b;
}
public object getPremier(){
return premier;
}
public object getSecond(){
return second;
}
}
Paire p = new
Paire ("abc", "xyz");
String x = (String)p.getPremier(); // le casting est obligatoire
Double y = (Double)p.getSecond(); // Il faut attendre l'exécution pour avoir
// une levée d'exception (ClassCastException)
public class
Paire<T> {
T premier ;
T second;
public Paire (T a, T b){
premier
a; second = b;
}
public T getPremier(){
return premier;
}
public T getSecond(){
return second;
}
}
Paire<String> p = new
Paire<String> ("abc", "xyz");
String x = p.getPremier(); // pas de cast
Double y = p.getSecond(); // erreur de compilation (type mismatch)
Soient les deux classes suivantes :
public class Super { ... } |
public class
Sous
extends Super {
... } |
Paire<Super> pSup = new Paire<Super>(new Super());
Paire<Sous> pSous = new Paire<Sous>(new Sous());
Supposons que nous définissions dans la classe X une autre méthode pour afficher des paires de Super, de la façon suivante :
public void afficheS(Paire<Super>p){ |
||||
Paire<Super> ps = new Paire<Super>(); Paire<Sous> pso = new Paire<Sous>();
|
Pour que la dernière instruction soit possible il faudrait définir la méthode afficheS de la façon suivante :
Les template C++ génèrent à la compilation autant de fichiers objets que d’instanciations des templates. Ceci n’est pas vrai en Java ou il n’y a qu’une seule instance de code généré à la compilation.