Genericite&JCF-2.pdf
Document Details
Uploaded by Deleted User
Full Transcript
ensa La généricité et Java Collection Framework A. Nejeoui Introduction JCF est un ensemble d’interfaces et de classes regroupées dans les packages java.util et java.concurrent, cet ensemble offre plusieurs structures de don...
ensa La généricité et Java Collection Framework A. Nejeoui Introduction JCF est un ensemble d’interfaces et de classes regroupées dans les packages java.util et java.concurrent, cet ensemble offre plusieurs structures de données afin de permettre une organisation, une manipulation et un stockage des objets sous différentes formes. Nous avons besoins de ces structures car chaque application nécessite une organisation bien adaptée de ses objets. Dans une situation vous avez besoins de stocker des objets dupliqués sous un certain ordre, dans une autre situation vous voulez éliminer les objets dupliqués et l’ordre n’est plus important pour vous…etc. ces structures de données sont représentés par un ensemble d’interfaces dans JCF, dans ce chapitre nous allons étudier les interfaces les plus utilisées et nous allons présenter une ou plusieurs implémentation pour chaque interface. Dans ce chapitre nous allons traiter les points suivants : ▪ AutoBoxing/UnBoxing ▪ Boucle foreach ▪ Généricité ▪ Interfaces de JCF : o Iterator o Collection o Set, SortedSet et NavigableSet o List o Map ▪ Les implémentations 22/10/2024 Génie Informatique AutoBoxing/UnBoxing Rappelez vous que chaque type en Java est considéré soit de type référence ou de type primitif. Les types référence sont les classes, les instances et les tableaux. Comme le montre le tableau suivant il y’a huit types primitif en Java, pour chaque type primitif Java définit une classe ‘enveloppe’ correspondante (wrrapper class) dans le package java.lang. Primitif Wrapper byte Byte short Short int Integer long Long float Float double Double boolean Boolean char Character 22/10/2024 Génie Informatique AutoBoxing/UnBoxing La conversion d’un type primitive en un objet de la classe correspondante s’appelle AutoBoxing et la conversion d’un objet en une variable du type primitif correspondant s’appelle unboxing. Java dans sa version 1.5 et supérieur gère automatiquement les conversion AutoBoxing et unboxing si nécessaire. Si par exemple une expression expr de type int apparaît là où un objet de type Integer est attendu, l’AutoBoxing consiste à convertir expr en « new Integer(expr) » et inversement. Exemple : List ints = new ArrayList(); ints.add(1); int n = ints.get(0); 22/10/2024 Génie Informatique Boucle foreach Considérons le code suivant : List ints = Arrays.asList(1,2,3); int s = 0; for (int n : ints) { s += n; } assert s == 6; Cette boucle s’appelle la boucle foreach , ce code est équivalent au code suivant : for (Iterator it = ints.iterator(); it.hasNext(); ) { int n = it.next(); //UnBoxing s += n; } assert s == 6; La boucle foreach peut être appliquée à tout objet qui implémente l’interface Iterable (définit dans le package java.lang), qui à son tour possède une référence à l’interface Iterator (définit dans le package java.util). Les interfaces Iterable et Iterator définissent les methods iterator(), hasNext() et next(), qui sont utilisé par la boucle foreach. interface Iterable { public Iterator iterator(); } interface Iterator { public boolean hasNext(); public E next(); public void remove(); } 22/10/2024 Génie Informatique Généricité Une interface ou une classe peut être déclarée de telle façon qu’elle accepte un ou plusieurs paramètres spécifiés entre < et > Si le paramètre de générique T n’est pas spécifié il est substitué par la classe Object. 22/10/2024 Génie Informatique Généricité Exemple : List words = new ArrayList(); words.add("Hello "); words.add("world!"); String s = words.get(0)+words.get(1); Sans la généricité ce code s’écrit : List words = new ArrayList(); words.add("Hello "); words.add("world!"); String s = ((String)words.get(0))+((String)words.get(1)) assert s.equals("Hello world!"); Les paramètres de généricité sont absents mais il faut faire un transtypage explicite à chaque fois que vous obtenez un élément de la liste. La généricité effectue implicitement les transtypages explicites nécessaires. Remarque : Le bytecode résultant des deux fragments de code précédents est le même. On dit que la généricité en Java est implémentée par Erasure. 22/10/2024 Génie Informatique Méthodes Génériques et les Varargs La méthode statique toList permet de convertir un tableau d’élément de type T en une List. Une méthode déclarée de cette manière s’appelle une méthode générique. Elle est invoquée en utilisant la syntaxe suivante : ListlistInt= GenMethode.toList(new Integer[]{1,3,8}); ListlisStr= GenMethode.toList(new String[] {"hello", "world“ }); Remarque : on peut ignorer le type lors de l’appel de la méthode si le type peut être déduit automatiquement. ListlistInt= GenMethode.toList(new Integer[]{1,3,8}); 22/10/2024 Génie Informatique Méthodes Génériques et les Varargs La méthode toList précédente accepte un tableau d’élements donc à chaque appel on doit instancier un tableau. Ne serait il pas plus simple si on pourrait passer une liste d’argument dont la taille sera déterminée au moment de l’exécution. La notion de Varargs introduite dans java 1.5 permet de faire ça (voir l’exemple suivant). 22/10/2024 Génie Informatique Transtypage de type générique Si B est un sous type de A alors B est un sous type de A Exemple : List nums = new ArrayList(); Si T est différent de S alors il n’ya pas de relation de sou typage entre A et B Exemple : 22/10/2024 Génie Informatique wildcards Examinons la méthode addAll définit dans l’interface collection : Cette méthode accepte comme argument Collection