📝 Ce que vous apprendrez

  • Qu'est-ce que les génériques et pourquoi sont-ils utiles ?
  • Comment utiliser les classes, méthodes et interfaces génériques ?
  • Types délimités et caractères génériques
  • Exemples concrets avec les collections

🧠 Que sont les génériques ?

Les génériques vous permettent de paramétrer les types. Au lieu d'écrire différentes classes pour différents types de données, vous pouvez écrire une classe ou une méthode générique.

List<String> names = new ArrayList<>();

✅ Permet de détecter les erreurs au moment de la compilation ✅ Évite le casting explicite ✅ Améliore la réutilisation du code

📦 Exemple de classe générique

class Box<T> {
    private T value;

    public void set(T value) { this.value = value; }
    public T get() { return value; }
}

Utilisez-le comme suit :

Box<String> b1 = new Box<>();
b1.set("Hello");
System.out.println(b1.get());

Box<Integer> b2 = new Box<>();
b2.set(42);

🛠️ Méthodes génériques

public class Utils {
    public static <T> void printArray(T[] array) {
        for (T item : array) {
            System.out.println(item);
        }
    }
}

🧱 Paramètres de type délimité

Utilisez des limites pour restreindre les types :

class MathBox<T extends Number> {
    public double square(T num) {
        return num.doubleValue() * num.doubleValue();
    }
}

🌀 Jokers - ?

Utilisé lorsque l'on veut de la flexibilité, en particulier avec l'héritage :

List<?> list = new ArrayList<String>(); // accepts any type

Types de caractères génériques :

Syntaxe Signification
<?> N'importe quel type
< ? extends T> Tout sous-type de T
< ? super T> Tout supertype de T

🔄 Génériques dans les collections

Les collections utilisent largement les génériques :

List<String> list = new ArrayList<>();
list.add("Hello");
// list.add(123);  // ❌ Compile error!

💡 Pourquoi utiliser les génériques ?

Sécurité de type au moment de la compilationPas besoin de castingRéutilisabilitéDes API plus propres (en particulier pour les bibliothèques et les frameworks)

📘 Recap

  • Les génériques rendent votre code plus sûr et plus propre
  • Utiliser <T> pour définir des types génériques
  • Les caractères génériques offrent une certaine souplesse (<?>, < ? extends>, < ? super>)
  • Les collections et de nombreuses API Java utilisent les génériques sous le capot