Java cours
Types paramétrés
Rémi Forax forax@univ-mlv.fr 1
Type paramétré
●
●
Exemple : une liste d'éléments paramétrée par le type des éléments
Déclaration
public class List<T> {
...
}
T est une variable de type.
●
Utilisation (appelé aussi instantiation)
...
public static void main(String[] args) {
List<String> l=...
}
2
Type paramétré et Java 1.4
●
En Java sans type paramétré, on crée une liste d'Object. public class List/*<T>*/ { void add(/*T*/Object e) {...}
Object/*T*/ get(int index) {...}
}
●
Comme tous les objets héritent de Object :
...
public static void main(String[] args) {
List/*<String>*/ l=new List/*<String>*/();
l.add("toto");
// ok grace au sous typage
String s=l.get(0);
// erreur
String s2=(String)l.get(0); // ok
}
●
C'est au programmeur de faire le cast
3
Le problème fréquent
●
Comme on utilise une liste d'Object, le compilateur accepte n'importe quel objet
...
public static void main(String[] args) {
List/*<String>*/ l=new List/*<String>*/();
l.add("toto");
// ok grace au sous typage
l.add(new Date());
// ok grace au sous typage
}
●
for(Object o:l) {
System.out.println((String)o); // ClassCastException
}
Ce programme compile mais plante à l'exécution
4
Le besoin de type paramétré
●
●
Comme on utilise Object comme type, il est difficile d'avoir un code :
–
Générique
(ne pas ré-écrire le code pour la liste de torchon, de serviette, de ...)
–
ET statiquement typé
(vérifiable par le compilateur)
Solution : permettre réellement les types paramétrés 5
Template en C++
–
Définition & Instantiation :
●
●
–
Lors de l'édition de lien, on instantie les templates et effectue la vérification. Pour :
●
–
On définit du code à trous (non vérifié)
permet la spécialisation de code
Contre :
●
recompilation de chaque instantiation
●
explosion du code en taille
●
code peu sûr
6
Generics en C#
–
–
Définition & Instantiation :
●
Le code du generics est vérifier lors de sa définition
●
le compilateur génére un code