1 Rappel : exemple simple

Documents pareils
F. Barthélemy. 17 mai 2005

Java 1.5 : principales nouveautés

Package Java.util Classe générique

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

Programmer en JAVA. par Tama

Projet de programmation (IK3) : TP n 1 Correction

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 )

Corrigé des exercices sur les références

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

Programmation Objet Java Correction

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

Auto-évaluation Programmation en Java

OpenPaaS Le réseau social d'entreprise

TP, première séquence d exercices.

Chapitre 10. Les interfaces Comparable et Comparator 1

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

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

PROGRAMMATION PAR OBJETS

Java Licence Professionnelle CISII,

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

Une introduction à Java

Développement Logiciel

Programmation avec des objets : Cours 7. Menu du jour

Utilisation d objets : String et ArrayList

Remote Method Invocation en Java (RMI)

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

ACTIVITÉ DE PROGRAMMATION

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

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

TP1. Outils Java Eléments de correction

Programmation par les Objets en Java

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

Gestion distribuée (par sockets) de banque en Java

Synchro et Threads Java TM

Utiliser Java sans BlueJ

Programmation Orientée Objet

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

La JVM. La machine virtuelle Java. La JVM. La JVM

Un ordonnanceur stupide

Remote Method Invocation (RMI)

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

RMI le langage Java XII-1 JMF

Chapitre VI- La validation de la composition.

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

Introduction au langage Java

Programmation Orientée Objet

Design patterns. Design patterns - définition. Design patterns - avantages

Introduction au langage de programmation Java

TD/TP PAC - Programmation n 3

Programme Compte bancaire (code)

Java RMI. Arnaud Labourel Courriel: Université de Provence. 8 mars 2011

Premiers Pas en Programmation Objet : les Classes et les Objets

Remote Method Invocation Les classes implémentant Serializable

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

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Java c est quoi? Java pourquoi?

INITIATION AU LANGAGE JAVA

Java et les annotations

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

Exercices sur les interfaces

Programmation en Java IUT GEII (MC-II1) 1

as Architecture des Systèmes d Information

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

Flux de données Lecture/Ecriture Fichiers

Calcul Parallèle. Cours 5 - JAVA RMI

TD/TP PAC - Programmation n 3

INF 321 : mémento de la syntaxe de Java

Exercices sur SQL server 2000

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

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Bases Java - Eclipse / Netbeans

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

Programmation Par Objets

Dis papa, c est quoi un bus logiciel réparti?

1 Définition d une classe en Java

LOG4430 : Architecture logicielle et conception avancée

Bases du langage. Historique Applications et applets Éléments de base du langage Classes et objets Les exceptions

Java Licence professionnelle CISII,

Java Licence Professionnelle CISII,

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

Initiation à JAVA et à la programmation objet.

Java et les bases de données

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Manuel d implémentation des Web Services Sous Axis1 et Axis2/Tomcat/linux. Par Pr Bouabid EL OUAHIDI

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

Apprendre Java en 154 minutes

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

Certificat Big Data - Master MAthématiques

Classe Interne, Anonyme & Enumération

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

Étude de l interopérabilité de deux langages de programmation basée sur la machine virtuelle de Java

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)

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

Threads. Threads. USTL routier 1

Composants Logiciels. Le modèle de composant de CORBA. Plan

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

Exploiter les statistiques d utilisation de SQL Server 2008 R2 Reporting Services

Programmation Objet 2

RN2-Programmation Orientée Objet - JAVA CH 1 Introduction à la POO et Java

Transcription:

La généricité en Java (suite) F. Barthélemy 14 mars 2006 1 Rappel : exemple simple class Liste <T> boolean estvide ( ) return true ; Liste <T> s u i t e ( ) throws ListeVideException throw ListeVideException. exc ; T t e t e ( ) throws ListeVideException throw ListeVideException. exc ; class ListeNonVide<T> extends Liste <T> T premier ; Liste <T> suivant ; ListeNonVide (T p, Liste <T> s ) premier = p ; suivant = s ; boolean estvide ( ) return f a l s e ; Liste <T> s u i t e ( ) throws ListeVideException return suivant ; T t e t e ( ) throws ListeVideException return premier ; class ListeVideException extends Exception static ListeVideException exc = new ListeVideException ( ) ; 1

class Autre static int longueur ( Liste <?> l ) throws ListeVideException int r e s = 0 ; while (! l. estvide ( ) ) r e s ++; l = l. s u i t e ( ) ; return r e s ; public static void main ( S t r i n g [ ] args ) throws ListeVideException Liste <Integer > l a l = new Liste <Integer >(); l a l = new ListeNonVide<Integer >(5, l a l ) ; l a l = new ListeNonVide<Integer >(7, l a l ) ; System. out. p r i n t l n ( longueur ( l a l ) ) ; class T e s t e L i s t e public static void main ( S t r i n g [ ] args ) throws ListeVideException Liste <String > l s = new Liste <String >(); l s = new ListeNonVide<String >( a r t, l s ) ; l s = new ListeNonVide<String >( gosh, l s ) ; Liste <String > l t = new Liste <String >(); l t = new ListeNonVide<String >( jam, l t ) ; l t = new ListeNonVide<String >( l s. t e t e ( ), l t ) ; l s = l s. s u i t e ( ) ; 2 Sécurité apportée par la généricité Première version : utilisation générique de la classe générique Liste. class ErreurTypage public static void main ( S t r i n g [ ] args ) Liste <String > l = new Liste <String >(); l = new ListeNonVide<String >( oui, l ) ; l = new ListeNonVide<String >(new I n t e g e r ( 4 ), l ) ; / > javac L i s t e. java L i s t e. java : 3 8 : cannot f i n d symbol symbol : c o n s t r u c t o r ListeNonVide ( java. lang. Integer, 2

Liste <java. lang. String >) l o c a t i o n : c l a s s ListeNonVide<java. lang. String > l = new ListeNonVide<String >(new I n t e g e r ( 4 ), l ) ; 1 e r r o r / Et si l on utilise la classe sans spécifier le paramètre générique, le code se compile, mais il y a un avertissement. class ErreurTypageBis public static void main ( S t r i n g [ ] args ) L i s t e l = new L i s t e ( ) ; l = new ListeNonVide ( oui, l ) ; l = new ListeNonVide (new I n t e g e r ( 4 ), l ) ; > javac L i s t e. java Note : L i s t e. java uses unchecked or unsafe o p e r a t i o n s. Note : Recompile with Xlint : unchecked for d e t a i l s. > javac Xlint : unchecked L i s t e. java L i s t e. java : 4 4 : warning : [ unchecked ] unchecked c a l l to ListeNonVide (T, L i s t e <T>) as a member o f the raw type ListeNonVide l = new ListeNonVide ( oui, l ) ; L i s t e. java : 4 5 : warning : [ unchecked ] unchecked c a l l to ListeNonVide (T, Liste <T>) l = new ListeNonVide (new I n t e g e r ( 4 ), l ) ; 2 warnings 3 Exemples de généricité dans la librairie Voici des exemples issus de la librairie. public interface Comparable<T> int compareto (T o ) ; public interface I t e r a b l e <T> I t e r a t o r <T> i t e r a t o r ( ) ; public interface I t e r a t o r <E> boolean hasnext ( ) ; E next ( ) ; void remove ( ) ; public f i n a l class I n t e g e r extends Number implements Comparable<Integer > 3

... public static int bitcount ( int i ) ; public int compareto ( I n t e g e r a n o t h e r I n t e g e r ) ;... public class Vector<E> extends AbstractList <E> implements List <E>,...... public Vector ( C o l l e c t i o n <? extends E> c ) ;... public boolean add (E o ) ; public boolean remove ( Object o ) ; public E f i r s t E l e m e n t ( ) ; public boolean c o n t a i n s A l l ( C o l l e c t i o n <?> c ) ;... 4 Des exemples compliqués import java. u t i l. ; c l a s s UnPeuComplique<A, B extends Vector<A>> B var ; UnPeuComplique (B b) var = b ; void vide ( ) var. c l e a r ( ) ; public static void main ( S t r i n g [ ] args ) Vector<Integer > v = new Vector<Integer >(); v. add ( 4 ) ; (new UnPeuComplique<Integer, Vector<Integer >>(v ) ). vide ( ) ; c l a s s Complique<A extends Comparable<A>,B extends Vector<A>> void m(b leb, A l e a ) i f ( l e a. compareto ( l e b. f i r s t E l e m e n t ())==0) System. out. p r i n t l n ( I l s sont egaux ) ; public static void main ( S t r i n g [ ] args ) Vector<Integer > v = new Vector<Integer >(); v. add ( 4 ) ; (new Complique<Integer, Vector<Integer > >()).m( v, 4 ) ; 4

5 Ce qui ne marche pas On ne peut pas instancier un objet ou un tableau avec un paramètre de type. On ne peut pas non plus utiliser un paramètre de type dans une méthode ou une variable statique. class Tableau<T> T [ ] t ; T v ; static T v2 ; void m( ) t = new T [ 1 0 ] ; v = new T( ) ; static T n ( ) return null ; / > javac TabGen. java TabGen. java : 4 : non s t a t i c c l a s s T cannot be r e f e r e n c e d from a s t a t i c c o n t e x t s t a t i c T v2 ; TabGen. java : 9 : non s t a t i c c l a s s T cannot be r e f e r e n c e d from a s t a t i c c o n t e x t s t a t i c T n () TabGen. java : 6 : g e n e r i c array c r e a t i o n t = new T[ 1 0 ] ; TabGen. java : 7 : unexpected type found : type parameter T r e q u i r e d : 4 e r r o r s / c l a s s v = new T( ) ; La solution : passer les objets et tableaux en paramètre au constructeur ou faire des contorsions. Autres choses qui ne marchent pas : les tests dynamiques. Par exemple instanceof et le cast. import java. u t i l. ; class MarchePas<T> 5

T lameth ( Object o ) return (T) o ; method m( Vector v ) i f ( v instanceof Vector<String >) System. out. p r i n t l n ( C en e s t un ) ; public static void main ( S t r i n g [ ] args ) Vector v = new Vector ( ) ; I t e r a b l e <String > t = ( I t e r a b l e <String >) v ; / > javac X l i n t : unchecked MarchePas. java MarchePas. java : 6 : cannot f i n d symbol symbol : c l a s s method l o c a t i o n : c l a s s MarchePas<T> method m( Vector v ) MarchePas. java : 4 : warning : [ unchecked ] unchecked c a s t found : java. lang. Object r e q u i r e d : T return (T) o ; MarchePas. java : 7 : i l l e g a l g e n e r i c type f o r i n s t a n c e o f i f ( v i n s t a n c e o f Vector<String >) MarchePas. java : 1 3 : warning : [ unchecked ] unchecked c a s t found : java. u t i l. Vector r e q u i r e d : java. lang. I t e r a b l e <java. lang. String > I t e r a b l e <String > t = ( I t e r a b l e <String >) v ; 2 e r r o r s 2 warnings / 6 Une chose surprenante Quand on donne plusieurs bornes supérieures à un paramètre de type, on ne peut pas toujours utiliser toutes les opérations de ces bornes supérieures. interface L i s i b l e void l i t ( ) ; interface E x t e n s i b l e 6

void etend ( ) ; abstract class Blabla abstract void cause ( ) ; abstract int degre ( ) ; abstract Blabla leplusbeau ( Blabla b ) ; c l a s s UneBorne<T extends Blabla > void m(t para ) para. cause ( ) ; para. leplusbeau ( null ) ; class DeuxBornes<T extends Blabla & L i s i b l e > void m(t para ) para. l i t ( ) ; para. cause ( ) ; para. leplusbeau ( para ) ; class DeuxBornesBis<T extends Blabla & L i s i b l e & Extensible > void m(t para ) para. l i t ( ) ; para. etend ( ) ; / > javac DeuxBornes. java DeuxBornes. java : 2 1 : cannot f i n d symbol symbol : method cause ( ) para. cause ( ) ; DeuxBornes. java : 2 2 : cannot f i n d symbol symbol : method leplusbeau (T) para. leplusbeau ( para ) ; 2 e r r o r s / Voyons les codes décompilés de ces classes : // Decompiled by Jad v1. 5. 8 e. Copyright 2001 Pavel Kouznetsov. // Jad home page : h t t p ://www. g e o c i t i e s. com/ kpdus / jad. html // Decompiler o p t i o n s : packimports (3) // Source F i l e Name : DeuxBornes. java class UneBorne 7

UneBorne ( ) void m( Blabla b l a b l a ) b l a b l a. cause ( ) ; b l a b l a. leplusbeau ( null ) ; // Decompiled by Jad v1. 5. 8 e. Copyright 2001 Pavel Kouznetsov. // Jad home page : h t t p ://www. g e o c i t i e s. com/ kpdus / jad. html // Decompiler o p t i o n s : packimports (3) // Source F i l e Name : DeuxBornes. java class DeuxBornes DeuxBornes ( ) void m( Blabla b l a b l a ) ( ( L i s i b l e ) b l a b l a ). l i t ( ) ; // Decompiled by Jad v1. 5. 8 e. Copyright 2001 Pavel Kouznetsov. // Jad home page : h t t p ://www. g e o c i t i e s. com/ kpdus / jad. html // Decompiler o p t i o n s : packimports (3) // Source F i l e Name : DeuxBornes. java class DeuxBornesBis DeuxBornesBis ( ) void m( L i s i b l e l i s i b l e ) l i s i b l e. l i t ( ) ; ( ( E x t e n s i b l e ) l i s i b l e ). etend ( ) ; 8

9