["extends" …] ["implements" …] {…} ou ["public" | "private"] "interface" ' ' > ["extends" …] {…} Exemple : /** * Generic version of the Box1 class. */ public class Box1 { private T t; public void add (T t) { this.t = t; } public T get ( ) { return this.t; } } Pour instancier un objet : new Box1 ( ) ou new Box1 ( ) Exemple dutilisation : public class Box1Demo{ public static void main (String[] args) { Box1 numberBox1 = new Box1 ( ); numberBox1.add (new Integer (10)); Number someNumber = numberBox1.get ( ); // no cast! System.out.println ("Box1 numberBox1 => " + someNumber); } soit avec une déclaration de référence : Box1 integerBox1 = new Box1 ( ); Box1 booleanBox1 = new Box1 ( ); OUTPUT: Box1 numberBox1 => 10"> ["extends" …] ["implements" …] {…} ou ["public" | "private"] "interface" ' ' > ["extends" …] {…} Exemple : /** * Generic version of the Box1 class. */ public class Box1 { private T t; public void add (T t) { this.t = t; } public T get ( ) { return this.t; } } Pour instancier un objet : new Box1 ( ) ou new Box1 ( ) Exemple dutilisation : public class Box1Demo{ public static void main (String[] args) { Box1 numberBox1 = new Box1 ( ); numberBox1.add (new Integer (10)); Number someNumber = numberBox1.get ( ); // no cast! System.out.println ("Box1 numberBox1 => " + someNumber); } soit avec une déclaration de référence : Box1 integerBox1 = new Box1 ( ); Box1 booleanBox1 = new Box1 ( ); OUTPUT: Box1 numberBox1 => 10">

La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

1 Cours JAVA / Y.Laborde Java : Les types génériques ( ) LES TYPES GENERIQUES : Introduction (diapo 2) Déclaration dun type générique (3) 1re déclaration.

Présentations similaires


Présentation au sujet: "1 Cours JAVA / Y.Laborde Java : Les types génériques ( ) LES TYPES GENERIQUES : Introduction (diapo 2) Déclaration dun type générique (3) 1re déclaration."— Transcription de la présentation:

1 1 Cours JAVA / Y.Laborde Java : Les types génériques ( ) LES TYPES GENERIQUES : Introduction (diapo 2) Déclaration dun type générique (3) 1re déclaration simple, (3) 2e décl. :, (5) 3e décl. :, (7) Déclaration multiple (8) Conventions de nommage (9) Déclaration dune méthode générique (10)

2 2 Cours JAVA / Y.Laborde : Introduction Présenté dans J2SE 5.0 (également appelé Java SE 6), ce perfectionnement du système de type longtemps attendu permet : de générer de multiples déclarations de types, de méthodes ou de constructeurs à laide dune seule déclaration générique, Ex: public class ArrayList … {… public boolean add(E e) {…} public E get(int index) {…} …} de générer de multiples déclarations de variables sur la base dun schéma de type générique inféré à la compilation. Ex:ArrayList laPioche = new ArrayList ; ArrayList lesJoueurs = new ArrayList ; Lavantage qui en résulte est de permettre de disposer densembles dont le type des éléments est contraint. Le Java Collections Framework utilise abondamment des classes déclarées comme des types génériques. Malgré une complexité apparente, ces classes sont très simples demploi. Ex: public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, Serializable public abstract class AbstractList extends AbstractCollection implements List public interface List extends Collection public interface Collection extends Iterable public interface Iterable Remarques: les types génériques de Java sont proches des Templates du C++ mais, par certains côtés, ils présentent dimportantes différences quil est nécessaire dassimiler. Voir The Java Tutorials : http://java.sun.com/docs/books/tutorial/java/generics/gentypes.html

3 3 Cours JAVA / Y.Laborde : Déclaration dun type générique (1) 1. Première SYNTAXE SIMPLE pour déclarer un type générique, comme classe ou interface : ["public" | "private"] "class" ' ' > ["extends" …] ["implements" …] {…} ou ["public" | "private"] "interface" ' ' > ["extends" …] {…} Exemple : /** * Generic version of the Box1 class. */ public class Box1 { private T t; public void add (T t) { this.t = t; } public T get ( ) { return this.t; } } Pour instancier un objet : new Box1 ( ) ou new Box1 ( ) Exemple dutilisation : public class Box1Demo{ public static void main (String[] args) { Box1 numberBox1 = new Box1 ( ); numberBox1.add (new Integer (10)); Number someNumber = numberBox1.get ( ); // no cast! System.out.println ("Box1 numberBox1 => " + someNumber); } soit avec une déclaration de référence : Box1 integerBox1 = new Box1 ( ); Box1 booleanBox1 = new Box1 ( ); OUTPUT: Box1 numberBox1 => 10

4 4 Cours JAVA / Y.Laborde public class Box1 { private T t; public void add (T t) { this.t = t; } public T get ( ) { return t; } } Autre exemple dutilisation : public class Box1Demo { public static void main (String[] args) { Box1 numberBox1 = new Box1 ( ); numberBox1.add (new Integer (10)); showGenericBox1 (numberBox1); } V1:public static void showGenericBox1 ( Box1 someBox1 ) { Number someNumber = (Number)someBox1.get ( ); // cast needed! System.out.println ("Box1 someBox1 => " + someNumber ); } V2:public static void showGenericBox1 ( Box1 someBox1 ) { System.out.println ("Box1 someBox1 => " + someBox1.get ( )); // no cast! } Il est aussi permis de déclarer des références à des types inconnus (avant inférence) ! On utilise alors un caractère jocker (wildcard) qui permet de désigner toutes les sortes de Box1 Mais on ne peut retrouver le type de quà laide dun cast ! Cette technique doit donc être évitée ! En effet, si nest pas un nombre, une exception sera levée !!! On peut tout de même saffranchir du cast ! Mais il nest alors possible dutiliser lobjet de type inconnu que comme un Object ! ICI: le compilateur traduit lusage de someBox1.get ( ) en someBox1.get ( ).toString() OUTPUT: Box1 someBox1 => 10 OUTPUT: Box1 someBox1 => 10 : Déclaration dun type générique (1)

5 5 Cours JAVA / Y.Laborde : Déclaration dun type générique (2) 2. Deuxième syntaxe pour déclarer un type générique, comme classe ou interface : ["public" | "private"] "class" ' "extends" ' > ["extends" …] ["implements" …] {…} ou ["public" | "private"] "interface" ' " extends " ' > ["extends" …] {…} où "extends" a un sens général qui convient aussi bien pour « extends » que pour « implements ». Exemple : public interface IAnimal { public void setName (String name); public String getName (); } /** * Generic version of the Box2 class. */ public class Box2 { private T t; public void add (T t) { this.t = t; } public T get ( ) { return this.t; } } public abstract class Animal implements IAnimal { private String name; // Constructor public Animal(String name) { this.name = name; } // override public String toString ( ) { return this.name; } // IAnimal method implementations public String getName ( ) { return this.name; } public void setName (String name) { this.name = name; } } public class Lion extends Animal { public Lion(String name) { super(name); } } public class Butterfly extends Animal { public Butterfly(String name) { super(name); } }

6 6 Cours JAVA / Y.Laborde public class Box2Demo { public static void main (String[] args) { Box2 lionBox2 = new Box2 ( ); lionBox2.add (new Lion ("Simba")); Box2 butterflyBox2 = new Box2 ( ); butterflyBox2.add (new Butterfly ("Citronade")); Box2Demo.showAnimalInBox2 (lionBox2);// Show animal from a Box2 Box2Demo.showAnimalInBox2 (butterflyBox2);// Show animal from a Box2 } public static void showAnimalInBox2 ( Box2 animalBox2) { IAnimal someAnimal = animalBox2.get( ); // no cast! System.out.println ( "Box2 animalBox2 => " + someAnimal.getName( ) + " : + someAnimal.getClass( ).getName( ) ); } Ajout dun Lion dans une Box2 Ajout dun Papillon dans une Box2 La méthode utilise un type générique avec un caractère jocker (wildcard) pour recevoir toutes les sortes de Box2 où T implemente au moins un IAnimal OUTPUT: Box2 animalBox2 => Simba : samplesgenerics.Lion Box2 animalBox2 => Citronade : samplesgenerics.Butterfly : Déclaration dun type générique (2)

7 7 Cours JAVA / Y.Laborde 3. Troisième syntaxe pour déclarer un type générique, comme classe ou interface : ["public" | "private"] "class" ' " super" ' > ["extends" …] ["implements" …] {…} ou ["public" | "private"] "interface" ' "super" ' > ["extends" …] {…} où "super" a un sens général qui convient aussi bien pour les classes que les interfaces. Le type générique signifie que le type inféré doit relever AU MINIMUM dune sorte de IAnimal, c-à-d quil doit implémenter linterface IAnimal ou ses sous- interfaces. Le type générique signifie que le type inféré doit relever AU MINIMUM dune sorte de Animal, c-à-d quil doit être de la classe Animal ou de lune de ses sous-classes. Dune manière équivalente, le type générique signifie que le type inféré doit relever AU MAXIMUM dune sorte de Animal, c-à-d quil doit être de la classe Animal ou de lune de ses super-classes. De plus, lusage dun caractère jocker est permis comme dans : ou. : Déclaration dun type générique (3)

8 8 Cours JAVA / Y.Laborde Un type générique peut être déclaré à laide de multiples paramètres de types génériques. Mais chacun doit être unique à lintérieur de sa déclaration de classe ou dinterface. La déclaration de Box est correcte. Par contre, la déclaration de Box génèrera une erreur sur la seconde occurrence de T. Exemple : /** * Generic version of the Box3 class. */ public class Box3 { private T t; private U u; public void addT (T t) { this.t = t; } public T getT ( ) { return this.t; } public void addU (U u) { this.u = u; } public U getU ( ) { return this.u; } } : Déclaration multiple

9 9 Cours JAVA / Y.Laborde : Type générique - Conventions Conventions usuelles de nommage du paramètre de type (Java SE API) : Par convention, les noms des paramètres de type sont de SIMPLES LETTRES en MAJUSCULE. Sans cette convention, il serait très difficile de différencier un type variable du nom dune classe ou dune interface ordinaire. Les noms les plus communément utilisés dans lAPI Java sont : SignificationUtilisés pour désigner TTypetypes quelconques E Elementéléments de collections du Java Collections Framework NNumbertypes devant être des nombres : Integer, Short, Double, …) KKeyclés relatives à des associations (key,value) VValuevaleurs relatives à des associations (key,value) S,U,V, …2 e, 3 e, 4 e types ?Type inconnu utilisé seul ou conjointement avec extends (upper bound) ou super (lower bound) suivi dun type (qui peut également être générique)

10 10 Cours JAVA / Y.Laborde 1. Première SYNTAXE SIMPLE pour déclarer une méthode générique : ["public" | … | "private"] ' > ' '(' [ ] ')' { } Exemple simple : /** * Generic version of the Box4 class. */ public class Box4 { private T t; public void add (T t) { this.t = t; } public T get ( ) { return this.t; } public void inspectBox4 ( U u ) { System.out.println ( "U: " + u.getClass().GetName() ); System.out.println ( "T: " + t.getClass().GetName() ); } OUTPUT: T: java.lang.Integer U: java.lang.String Exemple dapplication : public class Box4Demo { public static void main (String[] args) { Box integerBox = new Box ( ); integerBox.add (new Integer(10)); integerBox.inspect Box4 ("some text"); } OUTPUT: T: java.lang.Integer U: java.lang.String : Décl ion de méthode générique (1)

11 11 Cours JAVA / Y.Laborde Exemple plus réaliste de déclaration dune méthode générique : /** * Generic version of the Cage class. */ public class Cage { private T t; public void add (T t) { this.t = t; } public T get ( ) { return this.t; } // Remplissage des cages d'une liste de cages // avec un objet u public static // => méthode générique void fillBoxes (List > cages, U u) { // Itérer sur les cages de la liste de cages for (Cage cage : cages) // Ajouter l'objet u dans la cage { cage.add (u); } } // override public String toString ( ) { return "Cage(" + this.t.toString ( ) + ")"; } } public class CageDemo { public static void main (String[] args) { // Table des noms de lions String[] lionNames = {"Mufasa","Simba","Nala","Scar"}; // Créer une liste de lions (vide) List listLions = new ArrayList ( ); // Remplir la liste de lions en instanciant des lions // par itération de la table des noms de lions for(String lionName : lionNames) { listLions.add (new Lion(lionName)); } // Créer une liste de cages de lion (vide) List > listCages = new ArrayList >( ); // n : nombre aléatoire dans [0,nombre de lions[ int n = (int)(Math.random()*lionNames.length); // Ajouter n cages de lion (vides) dans la liste de cages for ( int i = 0 ; i <= n ; i++) { listCages.add (new Cage ( )); } // Remplir toutes les cages de la liste de cages // avec un même lion obtenu aléatoirement Cage. fillBoxes (listCages, listLions.get(n)); // Afficher le contenu de la liste de cages System.out.println (listCages); } Méthode générique Invocation de la méthode générique statique ( est optionnel) QUEL EST LAFFICHAGE PRODUIT ? OUTPUT:[Cage(Mufasa)] ou [Cage(Simba), Cage(Simba)] ouetc. : Décl ion de méthode générique (2)

12 12 Java : Les types génériques ( ) Cours JAVA / Y.Laborde Vous pouvez compéter cette formation à laide du tutoriel Java : http://java.sun.com/docs/books/tutorial/java/generics/gentypes.html ou (plus avancé) http://java.sun.com/docs/books/tutorial/extra/generics/index.html


Télécharger ppt "1 Cours JAVA / Y.Laborde Java : Les types génériques ( ) LES TYPES GENERIQUES : Introduction (diapo 2) Déclaration dun type générique (3) 1re déclaration."

Présentations similaires


Annonces Google