Vous êtes sur la page 1sur 19

NFP135 : Collections et généricité

BANSEPT Franck

1
Les collections
Les collections

Les collections ressemblent aux tableaux, mais ce sont des classes qui permettent de manipuler un
ensemble d’éléments. Elles utilisent un type générique (voir chapitre généricité) qui est la classe de
des objets à manipuler.

Il en existe plusieurs dont les plus utilisés sont :

● ArrayList
● HashMap et LinkedHashMap
● HashSet et LinkedHashSet

Chacune de ces collections ont des fonctionnalités bien spécifique.


ArrayList

ArrayList est utilisé pour stocker des instances


d’un type en particulier (Ici des instances de
Personne)

La méthode add() de
ArrayList permet d’ajouter
des élément dans la
collection
On peut accéder aux éléments
grâce à leur index via la
méthode get(), et connaître la
taille de la collection via la
méthode size()

Ou parcourir la liste via l’équivalent de


foreach en JAVA
HashSet

Les HashSet fonctionnent de la même manière que les


ArrayList, à l'exception qu’ils ne permettent pas d’insérer
2 fois la même instance d’un objet (basé sur son
hashcode)
HashMap Un HashMap est une collection d’association clé/valeur. Il
est déclaré à l’aide de 2 type générique. Le premier est le
type de la clé (ici Integer) et de la valeur (ici Personne)

Ils ne possèdent pas la méthode add(), mais put(). Cette


méthode prend en paramètre la valeur de la clé, et la
valeur associé

La méthode get prend en paramètre la valeur de la clé


associé à le valeur la valeur recherchée.
HashMap Un autre exemple en prenant cette fois ci une chaîne de
caractère comme type de clé.
collection
d’objet unique
collection d’objet
rapide en
collection écriture en milieu
d’objet rapide de list
en lecture

list d’association list d’association


clé/valeur parent/enfant
Généricité
La généricité

Vous avez surement remarqué le type à mettre entre chevrons lorsque l’on utilise une collection :

ex : ArrayList<Personne> listePersonne;

Les collections utilisent un type générique c’est à dire que c’est à l’utilisateur de la classe à décider quel sera
le type que l’on mettra à l’intérieur
La généricité Type générique
La généricité
Ce qui nous permet de déclarer quel sera le type qui remplacera “TypeAge” : ici on peut déclarer age en tant que
Integer ou String.

Type de age pour cette instance


La généricité avec héritage
Lorsque l’on passe un type générique à une classe, on peut restreindre les classes possibles à celle héritant
d’une autre classe. Cela permet d’ajouter une logique de restriction, mais également de pouvoir appeler les
méthodes de la classe. Sinon celle-ci serait considérée comme héritant de la classe Object.

Puisque animal sera de type Animal ou toute classe


héritant de Animal. Alors on peut accéder à la
méthode getNom() de Animal.
Classe avec plusieurs type générique
De la même manière il est possible de créer des classes avec plusieurs type générique

Puisque animalA sera de type Animal ou toute


classe héritant de Animal. Alors on peut accéder à la
méthode getNom() de Animal.
Classe avec plusieurs type générique
De la même manière il est possible de créer des classes avec plusieurs type générique

Grâce au type générique, on s’assurer que le retour


de getAnimalA() est de type Chien.
Exemple SANS type générique
Voici un exemple de la classe Chimere sans utiliser de type générique afin de bien comprendre leur utilité

Si l’on veut pouvoir accepter n’importe quelle classe


héritant de Animal, le type de animalA et animalB
doit être Animal.

Ici le type de retour de


getAmimalA() est Animal, on ne
peut donc accéder aux méthodes de
la classe Chien uniquement si l’on
effectue un cast hasardeux
Généricité wildcard ‘?’
Les types génériques peuvent utiliser le wildcard afin de permettre à n’importe quelle classe héritant d’une
classe en particulier d’être admise.

Ici on indique que la collection peut contenir


n’importe quel type qui hérite de personne
Généricité wildcard ‘?’

Soit la classe Heros et Salarié héritant de Personne :


Généricité wildcard ‘?’

Attention une fois utilisé, le type wildcard


verrouille la grille en lecture seule, ce code
n’est donc pas possible

Vous aimerez peut-être aussi