Aller au contenu principal

Génériques

Annexes15 minAnnexe

Écrire le comportement maintenant et fournir le type plus tard.

Dans cette leçon

Même comportement, deux types

La généricité permet d'écrire un comportement avant de connaître le type exact qu'il manipulera. À chaque utilisation, le compilateur vérifie que les valeurs respectent le type choisi.

Boxes.java

Ces deux classes racontent la même histoire. Stocker une valeur, puis la rendre. Seul le type change. Copier la classe pour chaque nouveau type multiplie le même code sans ajouter de comportement.

Le type arrive plus tard

Box.java
  1. La classe déclare T

    Box<T> dit : « cette classe attend encore un type ».
  2. L'utilisation fixe T

    Pour une Box<String>, le contrat accepte et rend des chaînes. Le compilateur vérifie chaque appel selon ce choix.
  3. Le compilateur garde la promesse

    names.setValue(42) ne compile pas. Aucune conversion silencieuse ne transforme l'entier en texte.

T n'est pas une valeur

T représente un type, comme String ou Integer. Ce n'est ni une variable à remplir pendant l'exécution, ni la taille de la boîte.

Une méthode peut aussi attendre son type

Values.java

La classe Values n'est pas générique. Seule sa méthode l'est. La déclaration <T> se place juste avant le type de retour. Ensuite, le paramètre et le retour utilisent ce même type.

L'ordre à retenir

static <T> T identity(T value)

D'abord la déclaration du type <T>, puis le type retourné T, puis le nom de la méthode.

Un contrat pour plusieurs types

Storage.java

L'interface garde un seul contrat. Une implémentation peut stocker du texte, des commandes ou des nœuds sans dupliquer les signatures. C'est le même principe derrière Stack<E>, List<E> et Map<K, V>.

Pour cette remédiation, arrêtez-vous ici. Les bornes, wildcards, règles de variance et détails d'effacement des types ne sont pas nécessaires.

Vérifiez la syntaxe

Vérifiez vos réflexes

Une réponse par question. La correction apparaît tout de suite.

1. Que représente T dans Box<T> ?
2. Quelle syntaxe déclare correctement une méthode générique ?
3. Que retourne Storage<String>.load() ?
4. Que fait box.setValue(42) si box est une Box<String> ?
5. Quand une interface générique est-elle utile ?

Retour au parcours

Centre de commandes

Rechercher une page et s'y rendre