Écrire du code qui fonctionne avec n'importe quel type ! Une seule fois, réutilisable partout. C'est la puissance des génériques.
Le T est un type que tu choisis. Sélectionne un type : la boîte se remplit du contenu correspondant et son étiquette Box<T> devient concrète. Une seule classe, tous les types, en sécurité.
Choisis un type pour remplir la boîte.
Tu as besoin d'une boîte pour ranger des strings ? Crée StringBox.
Pour des nombres ? Crée NumberBox.
Pour des users ? Crée UserBox...
= Code dupliqué !
Crée une seule Box<T> !
T = le type que tu veux. Instancie Box<String>, Box<Int>, etc.
= Un seul code, tous les types !
La même "boîte" peut contenir différents types :
<T> est un placeholder (paramètre de type). À l'utilisation, T est remplacé par le type réel !
public class Box<T> {
private T content;
public void set(T item) {
this.content = item;
}
public T get() {
return content;
}
}
// Utilisation
Box<String> stringBox = new Box<>();
stringBox.set("Hello");
String value = stringBox.get(); // Pas de cast !
Box<Integer> intBox = new Box<>();
intBox.set(42);
public static <T> T getFirst(List<T> list) {
return list.isEmpty() ? null : list.get(0);
}
// Le type est inféré automatiquement
String first = getFirst(List.of("a", "b", "c"));
Parfois, on veut limiter T à certains types. Par exemple : "T doit être comparable" ou "T doit être un nombre".
// T doit implémenter Comparable
public <T extends Comparable<T>>
T max(T a, T b) {
return a.compareTo(b) > 0 ? a : b;
}
// T doit avoir une prop 'length'
function logLength<T extends {length: number}>
(item: T): void {
console.log(item.length);
}
// T doit être un nombre
type Number interface {
int | float64
}
func Sum[T Number](nums []T) T { ... }
# T doit être une subclass de Animal
from typing import TypeVar
T = TypeVar('T', bound=Animal)
def feed(animal: T) -> T:
animal.eat()
return animal
| Aspect | ❌ Sans génériques | ✅ Avec génériques |
|---|---|---|
| Type safety | Cast manuel, erreurs au runtime | Vérifié à la compilation |
| Duplication | StringList, IntList, UserList... | List<T> une seule fois |
| Lisibilité | Object item = list.get(0); |
String item = list.get(0); |
| IDE support | Autocomplétion limitée | Suggestions typées |
| Refactoring | Risqué, erreurs cachées | Sûr, erreurs visibles |
List<User>
Map<String, Config>
Set<Permission>
Promise<Response>
Future<Data>
CompletableFuture<Result>
useState<number>(0)
useRef<HTMLInputElement>()
useContext<ThemeContext>()
ApiResponse<User[]>
Result<Data, Error>
Optional<Config>
Une erreur = Game Over ! 10 questions aléatoires.
Tu as terminé le parcours Fondamentaux de la Programmation ! Des variables aux génériques, tu maîtrises maintenant les concepts essentiels.