Generics parameterize a class, interface, or method by a type, like List<String>. The compiler checks types and avoids manual casts. Type parameters cannot be primitives, and the type is erased at runtime (type erasure).
Example
class Boite<T> {
private T valeur;
T get() { return valeur; }
}