up:: [[java]] title:: "code utilisable sur un type quelconque" #informatique --- > [!definition] Généricité > Possibilité d'écrire un cOde qui est utilisable avec des objets ou variables de types quelconques. ^definition > [!info] Implémentation > - en faisant [[java héritage|hériter]] du type `Object` > - # Types génériques ```java class Couple { private T x, y; public Couple(T fst, T snd) { // type des arguments adaptable x = fst; y = snd; } public T getSecond() { return y; } // type de retour adaptable } ``` - paramètre `T` : utilisé comme type - utiliser uen seule lettre Majuscule > [!attention] instanciation > - on ne peut pas instancier un objet de type `T` > - on ne peut pas créer un tableau d'un type générique ```java Couple c1 = new Couple(3, 4); Couple c2 = new Couple("foo", "bar"); c1 instanceOf Couple; // true c2 instanceOf Couple; // true ``` ## Limites - possible de contraindre les types génériques à l'aide d'une clause d'héritage ```java class Couple { ... } Couple c; // OK Couple d; // Erreur ``` - possible de faire de même avec les méthodes génériques - possible de forcer le type génériques à implémenter une interface ## Dérivation sur les types génériques ```java class C {...} class D extends C {...} // dérivation simple class E extends C {...} // + un type générique class F extends C {...} // contrainte // rendre générique une c´sse dérivée d'une instance particulière class G extends A {...} // Type de base non générique class H extends B {...} // idem // Erreurs class I extends C {...} // /!\ Erreur class J extends C {...} // /!\ Erreur ``` ## Type Joker ! - Si `T'` dérive de `T`, alors `C` ne dérive pas de `C` ```java Couple a = new Couple(3, 4); Couple b = new Couple(3.2, 4.3); Couple c; // type joker c = a; c = b; ``` # Méthodes génériques ```java ```