///////////////////////////////////////////////////////////////////////////////////// // Exemples où on ne demande rien au type T ///////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////// // sans interface //////////////////////////////////////////////////// class Couple{ private T x; private T y; public Couple(T xx, T yy){ x=xx; y=yy; } public T getX(){return x;} public T getY(){return x;} } //ou penser à une classe ListeChainee //intérêt par rapport à "ne pas utiliser et déclarer x et y comme Object" : x et y doivent être du même type //attention déclarer class MaClasse (avec un vrai type qui existe déjà) n'a pas de sens //le sert justement à déclarer un nom de type variable class TestCouple{ public static void main(String []args){ Couple c = new Couple<>(2,3); //on peut aussi faire Couple c2 = .. } } //////////////////////////////////////////////////// // avec interface //////////////////////////////////////////////////// interface IEnsemble{ void ajouter(T t); void supprimer(T t); } //tout comme dans la librairie Java on a "class ArrayList implements Collection", ici on aura: //on peut avoir une classe normale qui implémente cette interface class MaCollection implements IEnsemble{ //.. public void ajouter(String t){ //.. } public void supprimer(String t){ //.. } } //ou une classe générique qui implémente cette interface class Ens implements IEnsemble{ //on imagine une implem public void ajouter(T t){ //.. } public void supprimer(T t){ //.. } //on peut d'ailleurs utiliser d'autres classes génériques : //private ArrayList t; // } class TestEns{ public static void main(String []args){ //1) Ens e = new Ensemble(); //2) on peut aussi faire Ens e = .. //3) On peut aussi imaginer : // uneMethode(IEnsemble) (dans une classe ou méthode générique) // uneMethode(IEnsemble) } } ///////////////////////////////////////////////////////////////////////////////////// // Exemples où on demande quelque chose au type T ///////////////////////////////////////////////////////////////////////////////////// //attentin à la syntaxe, c'est class Truc et pas Truc //////////////////////////////////////////////////// // ex du cours //////////////////////////////////////////////////// class Vehicule{} class Garage { } //////////////////////////////////////////////////// // ex avec du > //////////////////////////////////////////////////// interface Comparable{ boolean estPlusGrand(T t); } class CoupleCompaV1>{ T o1; T o2; public CoupleCompaV1(T x1, T x2){ o1 = x1; o2 = x2; } public T getMax(){ if(o1.estPlusGrand(o2)){ return o1; } else{ return o2; } } } class MonInt implements Comparable{ int x; public MonInt(int xx){x=xx;} public boolean estPlusGrand(MonInt m){ return x>m.x; } } class Test{ public static void main(String[] args){ CoupleCompaV1 c1 = new CoupleCompaV1<>(new MonInt(2),new MonInt(3)); MonInt max = c1.getMax(); CoupleCompaV1> c2 = new CoupleCompaV1<>(new Gene("coucou",3),new Gene("hello",4)); } } // pour poursuivre cet exemple, on peut même faire une classe Generique qui implémente l'interface, cette fois ci on ne "demande rien" au type class Gene implements Comparable>{ //classe qui permet de "transformer" tout T en type qui implemente l'interface T x; int i; public Gene(T xx, int ii){x=xx;i=ii;} public boolean estPlusGrand(Gene t){return i > t.i;} } // On pourrait utiliser cette classe Gene, soit par comme dans le main au dessus, ou via une autre classe generique class Truc1{ //classe juste pour utiliser CoupleCompaV1 CoupleCompaV1> c; //chouette ! car CoupleCompaV1 pas possible : T n'implémente pas Comparable, mais Gene oui : Gene a transformé T quelconque en un T qui sait implémenter }