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.
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
La classe déclare T
Box<T>dit : « cette classe attend encore un type ».L'utilisation fixe T
Pour uneBox<String>, le contrat accepte et rend des chaînes. Le compilateur vérifie chaque appel selon ce choix.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
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
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.