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.

Slides:



Advertisements
Présentations similaires
La programmation orientée objet avec Java L3-MIAGE Plan
Advertisements

Généricité paramétrique en Java
Le mécanisme des exceptions
Introspection et Réflexion Manipulation dynamique de code Java.
Au programme du jour …. Ce que vous navez pas encore vu Constantes et variables de classe Main et Tests Utilisation de lAPI Existence des packages Existence.
Au programme du jour …. Introduction à lhéritage Un concept important de la programmation objet Livraison de code Organisation des répertoires et packages.
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
Au programme du jour …. Livraison de code Organisation des répertoires et packages Ce que vous navez pas encore vraiment vu Constantes et variables de.
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
Approfondissement du langage
(Classes prédéfinies – API Java)
F. Voisin : Introduction à Java 1 Introduction à Java - les interfaces - Frédéric VOISIN FIIFO - « Remise à Niveau »
Programmer en JAVA par Tama
LICENCE MIAGE Introduction Programmation Orientée Objet JAVA philippe
JAV - TD 6 Structures de données JAVA
Tarak Chaari, Stéphane Frénot, Frédérique Laforest, Frédéric Le-Mouël JAV1 JAV – TD 5 Lhéritage en Java.
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance
Programmation par Objets et Java
Programmation orientée objet
Structures de données et algorithmes – TP2
JavaBeans Réalise par: EL KHADRAOUY TARIK AOUTIL SAFOWAN.
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Langage Oriente Objet Cours 4.
Principes de programmation (suite)
Chapitre VII Généricité. POO-L3 H. Fauconnier2 Chapitre VII 1. Principes généraux 2. Types génériques imbriqués 3. Méthodes génériques 4. Types paramètres.
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Chapitre 21 Collections Partie I Introduction Une collection : est un objet qui regroupe multiple éléments dans une unité. Une collection est.
Classes abstraites et Interfaces
1 Objectifs de ce cours (I21) Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Résumé du cours précédent.
Langage Oriente Objet Cours 2.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 5 – Héritage, Interfaces et Listes génériques.
Une nouvelle structure de données : les tableaux
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
Rappels Java.
Introduction au paradigme orienté-objet (suite)
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
Design Pattern Memento. Principe : Enregistrer les changements d'états d'un objet Objectif : Pouvoir restituer les états précédents d'un objet.
IFT 6800 Atelier en Technologies d’information
1 Les paquetages («packages»). 2 L'objectif avec les paquetages («packages») est de rendre accessibles aux utilisateurs des classes définies par d'autres.
Vector, Iterator, LinkedList
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Cours 4 Héritage (suite).
COURS DE PROGRAMMATION ORIENTEE OBJET :
CSI 1502 Principes fondamentaux de conception de logiciels
Java, les objets : tout de suite ! Rassembler, grouper les objets
Une introduction à Java
Intention Séparer et extraire les traitements appliquées à différents type de nœuds d’une structure.
Objectifs À la fin de ce cours, vous serez capables de :
4 Introduction des objets. Les chaînes et tableaux
LIFI-Java 2004 Séance du Mercredi 22 sept. Cours 3.
Cours 9 Exceptions (fin) Généricité. POO-L3 H. Fauconnier2 Chaînage d'exceptions  Une exception peut être causée par une autre.  il peut être utile.
11/04/ L'héritage Cours 7 Cours 7.
Cours 7 Classes locales Clonage Divers: tableaux.
Tutorat en bio-informatique
Constructeurs H Batatia. Variable statique Une variable statique est partagée par tous les objets d’une classe.
Les classes présenté par: RAHMOUNE RIME / ZEKRI SELMA.
Les classes et les objets Les données finales class A { … private final int n = 20 ; // la valeur de n est définie dans sa déclaration … } class A { public.
Le polymorphisme.
Cours du 5 novembre.
Héritage H. Batatia. plan Notion (que signifie l’héritage) Ecriture en java Héritage multiple (interdit) Instanciation (partie propre et partie héritée)
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Introduction à la programmation objet avec java
Héritage Conception par Objet et programmation Java
Généricité.
BlueJ_III 1 Java, les objets : tout de suite ! Interaction entre objets Notes de cours associées au chapitre 3 tutorial BlueJ
LES CLASSES ET LES OBJETS
Transcription de la présentation:

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 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 :

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 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 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 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 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 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 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 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 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 Java : Les types génériques ( ) Cours JAVA / Y.Laborde Vous pouvez compéter cette formation à laide du tutoriel Java : ou (plus avancé)