P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )



Documents pareils
Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Généricité. en Java. (polymorphisme paramétrique) Philippe GENOUD UJF Janvier

Java 1.5 : principales nouveautés

Héritage presque multiple en Java (1/2)

Chapitre 10. Les interfaces Comparable et Comparator 1

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Auto-évaluation Programmation en Java

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Généralités sur le Langage Java et éléments syntaxiques.

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Package Java.util Classe générique

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Programmer en JAVA. par Tama

2 e édition JAVA 5 et 6. Jérôme Bougeault. TSoft et Groupe Eyrolles, 2003, 2008, ISBN :

F. Barthélemy. 17 mai 2005

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Programmation par les Objets en Java

Java Licence Professionnelle CISII,

Chapitre VI- La validation de la composition.

Classe Interne, Anonyme & Enumération

TD/TP PAC - Programmation n 3

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Diagramme de classes

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Programmation Orientée Objet Java

Initiation à JAVA et à la programmation objet.

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

as Architecture des Systèmes d Information

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

TP1 : Initiation à Java et Eclipse

Langage Java. Classe de première SI

Plan du cours. Historique du langage Nouveautés de Java 7

Facultés Universitaires Notre-Dame de la Paix. Conception et Programmation Orientées- Object

Une introduction à Java

Programmation Objet Java Correction

TD/TP PAC - Programmation n 3

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

RMI le langage Java XII-1 JMF

INITIATION AU LANGAGE JAVA

4. Groupement d objets

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Utilisation d objets : String et ArrayList

Objets et Programmation. origine des langages orientés-objet

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Cours 1: Java et les objets

Chapitre 2. Classes et objets

Aide mémoire UML & Java 1ère partie : Introduction. marc.lemaire@u-cergy.fr

Chapitre V. Les classes : Object, Vector, etc.

Exercices sur les interfaces

Programmation par composants (1/3) Programmation par composants (2/3)

Environnements de développement (intégrés)

Java c est quoi? Java pourquoi?

Java Licence professionnelle CISII,

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Programmation Par Objets

Programmation Orientée Objet

Projet de programmation (IK3) : TP n 1 Correction

Java Licence Professionnelle CISII,

Threads. Threads. USTL routier 1

Corrigé des exercices sur les références

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

Programmation Orientée Objet application au langage Java Version Novembre 2007

Remote Method Invocation (RMI)

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Génie Logiciel avec Ada. 4 février 2013

Initiation à la programmation orientée-objet avec le langage Java

Apprendre la Programmation Orientée Objet avec le langage Java (avec exercices pratiques et corrigés)

Cours d initiation à la programmation en C++ Johann Cuenin

ACTIVITÉ DE PROGRAMMATION

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

TP, première séquence d exercices.

Java DataBaseConnectivity

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

PROGRAMMATION PAR OBJETS

JAVA 8. JAVA 8 - Les fondamentaux du langage. Les fondamentaux du langage Java. Avec exercices pratiques et corrigés JAVA 8 29,90.

1 Définition d une classe en Java

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Le langage JAVA G. Baulieu Institut de Physique Nucléaire de Lyon Septembre 2009

JAVA. Introduction à la programmation objet avec java 1/4. Nadir BOUSSOUKAIA

Présentation. Au programme. Fonctionnement. A l issue de ce module vous devriez...

Utiliser Java sans BlueJ

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

JAVA TD0. Prise en main du langage Environnement de base JAVA 1

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Premiers Pas en Programmation Objet : les Classes et les Objets

Programmation Objet I

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Chapitre 5 : Les procédures stockées PL/SQL

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Cours 14 Les fichiers

Application web de gestion de comptes en banques

I. Introduction aux fonctions : les fonctions standards

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Remote Method Invocation Les classes implémentant Serializable

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Transcription:

P r ob lé m a t iq u e d e la g é n é r icit é les versions de Java antérieures à 1.5 permettaient de créer des classes de structures contenant n'importe quels types d'objet : les collections (classes implémentant l'interface Collection) des classes créées par le programmeur et travaillant sur des instances d'object Problèmes : manipuler les objets référencés par ces structures oblige à faire du transtypage vers le bas (downcasting). Ex : Truc étant une classe Vector v = new Vector(); Truc t = (Truc) v.get(12); risque d'erreur de cast, repérables uniquement à l'exécution (ClassCastException) impossibilité d'obliger à ce qu'une collection ne contienne qu'un seul type d'objet (comme avec les tableaux) 1 Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 ) La solution consiste à paramétrer les classes qui opéraient avant sur des Object par un type (classe) qui sera défini lors de l'utilisation de la classe. On utilise une variable de type. Licence Exemple Informatique 3e : année Programmation objet avancée public class Pair <T> { private T one,two; public Pair(T one, T two){this.one = one;this.two = two; public T getfirst(){return this.one; public T getsecond(){return this.two; public void setfirst(t one){this.one = one; public void setsecond(t two){this.two = two; 2

Pr in cip e d e la g é n é r icit é e n Ja v a ( 2 /3 ) Exemple d'une classe à deux variables de type : public class PairBis <X,Y> { private X first; private Y second; public PairBis(X a, Y b) {this.first = a; this.second = b; public X getfirst() {return this.first; public Y getsecond() {return this.second; public void setfirst(x a) {this.first = a; public void setsecond(y b) {this.second = b; 3 Pr in cip e d e la g é n é r icit é e n Ja v a ( 3 /3 ) Une classe générique ne peut être utilisée telle quelle mais doit être instanciée. public static void main(string arg[]){ Instancier une classe générique consiste à donner une valeur à la (ou les) variable(s) de type Pair <String> p = new Pair<String>("bonjour", "le monde"); p.setfirst(new String("Hello")); p.setsecond(new String("World")); Pair <Pair> pp = new Pair<Pair> // interdit Pair<Pair<String>> pp = new Pair<Pair<String>>(new Pair("salut","la terre"),new Pair("ici","la Lune")); HashMap<Integer,String> m = new HashMap<Integer,String>(); 4

M é ca n ism e d e la g é n é r icit é A la compilation, lors de l'instanciation d'une classe générique, les paramètres de type sont remplacés par le type spécifié Une seule classe compilée est produite, quelque soit le nombre Licence d'instanciations Informatique 3e année Programmation objet avancée Les variables de type sont oubliées (ne sont plus connues après compilation) Le compilateur doit parfois ajouter des cast pour respecter les contraintes de type En pratique, le mécanisme est assez complexe (et devient encore plus compliqué avec les types contraints, voir plus loin) 5 U t ilisa t ion d e s v a r ia b le s d e t y p e Les types paramètres peuvent être utilisés pour déclarer des variables (y compris des tableaux) public class Pair <T>{ public class GenClass <T>{ private T tab[]; Les types paramètres ne peuvent être utilisés pour créer des objets (ni des tableaux) On ne peut pas utiliser un paramètre de type avec instanceof (car à l'exécution, le type n'est plus connu) On peut utiliser un paramètre de type pour instancier une classe générique dans la classe paramètrée l = new ArrayList<T>(); 6

Gé n é r icit é e t a b st r a ct ion Les interfaces et classes abstraites peuvent être rendues génériques par paramétrage de type public interface MyInterface <T>{ public class MyClass implements MyInterface<String>, MyInterface<Integer>{ On peut instancier une classe (ou interface) générique par une classe abstraite ou une interface. Les objets utilisés dans la classe instanciée seront par contre forcément des instances de classes concrètes Il est impossible d'implémenter deux interfaces qui sont des instanciations de la même interface générique 7 V a r ia b le d e t y p e e t m é t h od e d e cla sse Il est impossible d'utiliser une variable de type dans une méthode static public class Pair <T> { public static void mymethod(){ T var; // erreur à la compilation 8

H é r it a g e e t g é n é r icit é ( 1 /2 ) On peut étendre une classe générique par une autre classe générique, à condition que les variables de type soient les mêmes (à une susbtitution près) public class Pair <T> { public class Triplet <T> extends Pair <T> { T three; public Triplet (T one, T two, T three){ super(one,two); this.three = three; public void setthird(t three){this.three = three; public T getthird(){return this.three; 9 H é r it a g e e t g é n é r icit é ( 2 /2 ) Les règles de sous-typage des classes génériques sont : Si C <T> extends D <T> alors C <T> est une sous-classe de D <T> (au sens où toute instance de l'une est instance de l'autre) On interdit donc que Pair<Integer> soit sous-classe de Pair<Object> La relation d'héritage reste valide entre instanciations de C et D par un même type. Par exemple, C <String> est sous-classe de D <String>. Cette relation d'héritage n'est pas valide entre instanciations de C et D par des types différents, même si ces types sont liés par héritage! Exemple : Integer est sous-classe de Object mais le code suivant n'est pas correctement typé Pair<Integer> p = new Pair<Integer>(3,4); Pair<Object> q = p; q.setfirst("toto"); Une instanciation d'une classe générique n'est pas sous-classe de la classe générique : C <String> n'est pas sous-classe de C <T> Exemple : le code suivant n'a aucun sens Pair<T> p = new Pair<Integer>(3,4); 10

M é t h od e s g é n é r iq u e s Une méthode peut être paramétrée par un type, qu'elle soit dans une classe générique ou non public class MyClass{ L'appel de la méthode nécessite de l'instancier par un type, sauf si le compilateur peut réaliser une inférence de type public static <T> void permute(t[] tab, int i, int j){ T temp = tab[i]; tab[i] = tab[j]; tab[j] = temp; String[] tabs = new String[]{"toto","titi","tutu"; Float[] tabf = new Float[]{3.14f,27.12f; MyClass.<String>permute(tabs,0,2); MyClass.permute(tabf,0,1); 11 Problème : Ty p e s con t r a in t s on veut pouvoir manipuler les types paramètres (appeler des méthodes sur des instances de ces types, ) 12 public class MyClass <Type1 extends OtherClass & Interface1 & Interface2, Type2> { mais on ne connait rien de ces types, à part qu'ils héritent de Object Solution : on précise qu'un type paramètre hérite d'une classe ou d'une (ou plusieurs) interface(s) qui possède(ent) les méthodes que l'on veut utiliser sur les instances du type Exemple : public class MyList <T extends Comparator> {

In st a n cia t ion a v e c jok e r ( 1 /3 ) Problème : on voudrait qu'une méthode écrite pour un type générique T puisse fonctionner avec toute instance des sousclasses de T Exemple : public static void printnumber(arraylist<number> l){ for(iterator i = l.iterator();i.hasnext();){ System.out.println(l.next()); ArrayList<Integer> l = new ArrayList<Integer>(); MyClass.printElements(l); // Erreur à la compilation // ArrayList<Integer> n'est pas sous-type de ArrayList<Number> 13 In st a n cia t ion a v e c jok e r ( 2 /3 ) Solution : on peut spécifier qu'un paramètre de type est toute sous-classe ou sur-classe d'une classe donnée <?> désigne un type inconnu <? extends C> désigne un type inconnu qui est soit C soit un sous-type de C <? super C> désigne un type inconnu qui est soit C soit un sur-type de C C peut être une classe, une interface ou un paramètre de type Exemples : public static void printnumber(arraylist<? extends Number> l){ for(iterator i = l.iterator();i.hasnext();){ System.out.println(l.next()); public static <T> void fillelement(arraylist<? super T> l, T e){ for(int i = 0;i<l.size();i++){ l.set(i,e); 14

In st a n cia t ion a v e c jok e r ( 3 /3 ) De tels types avec joker ne peuvent être utilisés qu'à l'instanciation d'une classe générique! Exemple : supposons que B soit sous-type de A De tels types avec joker ne peuvent pas être utilisés pour créer des objets ou des tableaux (sauf si le type est non contraint) new ArrayList<? extends Integer>(); // interdit new List<? extends Integer>[10]; // interdit new List<?>[10]; // autorisé Le compilateur impose des règles complémentaires pour éviter des anomalies ArrayList<? extends A>; l = new ArrayList<B>(); l.add(new A()); // interdit 15 Con clu sion La généricité apporte souplesse et robustesse dans le code La généricité apporte une complexité importante Utiliser les classes génériques existantes n'est pas compliqué Créer ses propres classes génériques est plus difficile Le compilateur se charge normalement de détecter la plupart des problèmes (en particulier ceux, nombreux, qui n'ont pas été abordés dans ce cours) La généricité est plus simple quand elle est prévue au départ (ADA, C++) 16

Au t r e s n ou v e a u t é s d e Ja v a 1.5 ( 1 /2 ) Nombre variable d'arguments : Un seul argument variable par méthode, toujours en fin de liste d'arguments On peut substituer un tableau à l'argument 17 Boucle for étendue : peut s'utiliser sur toute classe implémentant Autoboxing : faciliter le passage entre types primitifs et instances Iterable public void mymethod(string t, Object arg){ for(int i=0;i<arg.length;i++){ mymethod("truc","un","deux","trois",4); Integer i = 12; // autoboxing int j = i; // autounboxing Collection c = new LinkedList(); for(object o : c){ Au t r e s n ou v e a u t é s d e Ja v a 1.5 ( 2 /2 ) Enumérations : un nouveau type (chaque enumération produit une classe dans la JVM) values() renvoie un tableau des valeurs, valueof(string) renvoie la valeur enum MyEnum {LUNDI,MARDI,MERCREDI,JEUDI,VENDREDI,SAMEDI,DIMANCHE; MyEnum e = MyEnum.MARDI; for(int i = 0;i<MyEnum.values().length;i++) System.out.println(MyEnum.values()[i]); for(myenum f : MyEnum.values()) System.out.println(f); Import static : Amélioration de la javadoc import static java.lang.math; double d = PI; // pas besoin de préfixer PI par Math 18