Java 1.5 : principales nouveautés



Documents pareils
F. Barthélemy. 17 mai 2005

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

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 )

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

Package Java.util Classe générique

Programmer en JAVA. par Tama

Programmation par les Objets en Java

Auto-évaluation Programmation en Java

Chapitre VI- La validation de la composition.

Une introduction à Java

Utilisation d objets : String et ArrayList

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

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

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

Corrigé des exercices sur les références

Programmation Par Objets

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Java Licence Professionnelle CISII,

Classe Interne, Anonyme & Enumération

Remote Method Invocation Les classes implémentant Serializable

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

Threads. Threads. USTL routier 1

Premiers Pas en Programmation Objet : les Classes et les Objets

Utiliser Java sans BlueJ

Chapitre 10. Les interfaces Comparable et Comparator 1

Bases Java - Eclipse / Netbeans

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

ACTIVITÉ DE PROGRAMMATION

as Architecture des Systèmes d Information

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

Cours 1: Java et les objets

4. Groupement d objets

Programmation Objet Java Correction

Classes et Objets en Ocaml.

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

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

Initiation à JAVA et à la programmation objet.

Remote Method Invocation (RMI)

Calcul Parallèle. Cours 5 - JAVA RMI

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

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

PROGRAMMATION PAR OBJETS

TP, première séquence d exercices.

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

RMI le langage Java XII-1 JMF

TP1 : Initiation à Java et Eclipse

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.

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

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

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

Remote Method Invocation en Java (RMI)

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

Introduction. Les méthodes. Les méthodes. Identité et égalité. Identité et égalité. La copie d'objets. Identité et égalité.

INITIATION AU LANGAGE JAVA

Tp 1 correction. Structures de données (IF2)

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

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

1 Définition d une classe en Java

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

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

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

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

Java c est quoi? Java pourquoi?

Java Licence Professionnelle CISII,

Traduction des Langages : Le Compilateur Micro Java

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

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Introduction au langage de programmation Java

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

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

Java Licence professionnelle CISII,

Corrigés des premiers exercices sur les classes

Analyse de sécurité de logiciels système par typage statique

Programmation Orientée Objet

Derrière toi Une machine virtuelle!

Programmation Objet I

TD/TP PAC - Programmation n 3

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

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

LOG4430 : Architecture logicielle et conception avancée

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

Un ordonnanceur stupide

Synchro et Threads Java TM

Programmation en Java IUT GEII (MC-II1) 1

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

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

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Cours 1 : La compilation

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

Langage Java. Classe de première SI

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

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

OpenPaaS Le réseau social d'entreprise

Projet de programmation (IK3) : TP n 1 Correction

Programmation. fonctionnelle, impérative, logique et orientée objet

ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

Traitement de données

modules & compilation

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Transcription:

Cours 6 - TEP - UPMC - 2008/2009 p. 1/34 Java 1.5 : principales nouveautés classes paramétrées : generics encapsulation des valeurs de types primitifs : auto[un]boxing itération sur les boucles types énumérés nombre d arguments variable des méthodes : varargs http://java.sun.com/developer/technicalarticles/releases/j2se15/ java.sun.com/developer/technicalarticles/releases/j2se15langfeat/

Cours 6 - TEP - UPMC - 2008/2009 p. 2/34 Génériques en Java 1.5 But : manipuler des classes paramétrées pour un code plus sûr et plus lisible Contraintes : utiliser la même machine virtuelle être compatible ascendant (programmes 1.4 compilables)

Cours 6 - TEP - UPMC - 2008/2009 p. 3/34 Motivations typage statique générique pour diminuer les tests dynamiques de types écrire des structures de données génériques classiques et effectuer des calculs dessus faciliter la lecture des programmes répondre aux critiques d autres langages : C++, Ada95, O Caml, Haskell... tenir compte de propositions d extension : Pizza, GJ,... répondre à l avance à C#

Cours 6 - TEP - UPMC - 2008/2009 p. 4/34 Contraintes compatible avec les versions antérieurs : du langage des bibliothèques de la machine abstraite cohabitation possible entre codes/bibliothèques antérieurs ne pas être coûteux si on ne s en sert pas

Cours 6 - TEP - UPMC - 2008/2009 p. 5/34 Influences polymorphisme paramétrique (ML, ) propositions Pizza et GJ : Pizza : http://pizzacompiler.sourceforge.net/ GJ : : http://homepages.inf.ed.ac.uk/wadler/pizza/gj/ Géneriques pour C# et.net : http://research.microsoft.com/projects/clrgen/

Cours 6 - TEP - UPMC - 2008/2009 p. 6/34 Java 1.4 : API vecteurs extensibles: java.util Class ArrayList hiérarchie de classes: java.lang.object java.util.abstractcollection java.util.abstractlist java.util.arraylist principales méthodes: ArrayList(int initialcapacity) void add(int index, Object element) Object get(int index) Object set(int index, Object element)

Cours 6 - TEP - UPMC - 2008/2009 p. 7/34 Java 1.4 : utilisation (UD.java) import java.util.arraylist; class UD { public static void main(string[] a) { ArrayList al1=new ArrayList(3); al1.add(0,new Integer(3)); al1.add(1,"salut"); Integer x = (Integer)(al1.get(0)); Integer y = (Integer)(al1.get(1)); // int res = x.intvalue() + y.intvalue(); compilation : javac -source 1.4 UD.java exécution : exception $ java UD Exception in thread "main" java.lang.classcastexception: java.lang.string at UD.main(UD.java:8)

Cours 6 - TEP - UPMC - 2008/2009 p. 8/34 Java 1.5 : API vecteurs extensibles: java.util Class ArrayList<E> hiérarchie de classes: java.lang.object java.util.abstractcollection<e> java.util.abstractlist<e> java.util.arraylist<e> principales méthodes: ArrayList(int initialcapacity) void add(int index, E element) E get(int index) E set(int index, E element)

Cours 6 - TEP - UPMC - 2008/2009 p. 9/34 Java 1.5 : utilisation (UD.java) warnings à la compilation $ javac -source 1.5 UD.java Note: UD.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. -bash-3.00$ javac -source 1.5 -Xlint:unchecked UD.java UD.java:5: warning: [unchecked] unchecked call to add(int,e) as a member of t al1.add(0,new Integer(3)); ˆ UD.java:6: warning: [unchecked] unchecked call to add(int,e) as a member of t al1.add(1,"salut"); ˆ 2 warnings exception à l exécution $ java UD Exception in thread "main" java.lang.classcastexception: java.lang.string at UD.main(UD.java:8)

Cours 6 - TEP - UPMC - 2008/2009 p. 10/34 Java 1.5 : classe paramétrée (US.java) import java.util.arraylist; class US { public static void main(string[] a) { ArrayList<Integer> al1= new ArrayList<Integer>(3); al1.add(0,new Integer(3)); al1.add(1,"salut"); Integer x = (Integer)(al1.get(0)); Integer y = (Integer)(al1.get(1)); int res = x.intvalue() + y.intvalue(); erreur à la compilation US.java:6: cannot find symbol symbol : method add(int,java.lang.string) location: class java.util.arraylist<java.lang.integer> al1.add(1,"salut"); ˆ 1 error

Cours 6 - TEP - UPMC - 2008/2009 p. 11/34 Limitations paramètre de type instancié par une classe ou une interface pas par un type primitif auto-boxing pas de manipulation du paramètre de type à l exécution : pas de cast avec type paramétré (warning) ni d instanceof (erreur), ni de catch (erreur) pas de type paramétré comme type des éléments d un tableau : cela vient du sous-typage entre tableaux.

Cours 6 - TEP - UPMC - 2008/2009 p. 12/34 Typage et compatibilité raw type : type paramétré sans paramètre (compatibilité) Type<A> vers RawType RawType vers Type<A> : warning pas de sous-typage sur les paramètres de types : erreur ArrayList<String> as = new ArrayList<String>(3); ArrayList<Object> ao = as;... incompatible types found : java.util.arraylist<java.lang.string> required: java.util.arraylist<java.lang.object> ArrayList<Object> ao = as; pas de création de tableaux paramétrés : erreur A[] aa = new A[10];

Cours 6 - TEP - UPMC - 2008/2009 p. 13/34 Warning à la compilation javac -Xlint:unchecked UD.java Danger : voir de 2 manières une même structure ArrayList<String> als = ArrayList al = als; new ArrayList<String>(10); als.add(1,"salut"); als.add(2,new Integer(4)); pas de unchecked warning pas d exception ClassCastException

Cours 6 - TEP - UPMC - 2008/2009 p. 14/34 Exemple : QueueD.java (1) import java.util.arraylist; class Vide extends Exception { class Pleine extends Exception { class QueueD { int taille, longueur; ArrayList q; int tete, fin; QueueD(int n) {taille = n; q = new ArrayList(n); void entrer(object x) throws Pleine { if (longueur < taille) { q.add(fin++ % taille,x); longueur++; else throw new Pleine(); Object partir() throws Vide { if (longueur > 0) { longueur--; return q.get(tete++ % taille); else throw new Vide();

Cours 6 - TEP - UPMC - 2008/2009 p. 15/34 Exemple : Queue.java (2) class Vide extends Exception { class Pleine extends Exception { class Queue<A> { int taille, longueur; A[] q; int tete, fin; Queue(int n) {taille = n; q = new A[n]; void entrer(a x) throws Pleine { if (longueur < taille) { q[fin++ % taille] = x; longueur++; else throw new Pleine(); A partir() { if (longueur > 0) { longueur--; return q[tete++ % taille]; else throw new Vide();

Cours 6 - TEP - UPMC - 2008/2009 p. 16/34 Exemple : QueueS.java (3) import java.util.arraylist; class Vide extends Exception { class Pleine extends Exception { class QueueS<A> { int taille, longueur; ArrayList<A> q; int tete, fin; QueueS(int n) {taille = n; q = new ArrayList<A>(n); void entrer(a x) throws Pleine { if (longueur < taille) { q.add(fin++ % taille, else throw new Pleine(); x); longueur++; A partir() throws Vide { if (longueur > 0) { longueur--; return q.get(tete++ % taille); else throw new Vide();

Cours 6 - TEP - UPMC - 2008/2009 p. 17/34 Exemple : compilation (4) QueueD : $ javac -Xlint:unchecked QueueD.java QueueD.java:14: warning: [unchecked] unchecked call to add(int,e) as a me if (longueur < taille) { q.add(fin++ % taille,x); longueur++; ˆ 1 warning Queue : $ javac -Xlint:unchecked Queue.java Queue.java:10: generic array creation Queue(int n) {taille = n; q = new A[n]; ˆ 1 error QueueS : $ javac -Xlint:unchecked QueueS.java

Cours 6 - TEP - UPMC - 2008/2009 p. 18/34 Exemple : exécution (5) UQS.java import java.util.arraylist; class UQS { public static void main(string[] a) { QueueS<Integer> q = new QueueS<Integer>(3); try { q.entrer(new Integer(3)); q.entrer(new Integer(4)); Integer x = q.partir(); Integer y = q.partir(); int res = x.intvalue() + y.intvalue(); System.out.println(res); catch (Exception e) {System.out.println(e.toString()); compilation : $ javac -Xlint:unchecked UQS.java exécution $ java UQS 7

Cours 6 - TEP - UPMC - 2008/2009 p. 19/34 Méthodes paramétrées introduction d une variable de type au niveau de la méthode import java.util.*; interface Comparator<T> { public int compare(t x, T y); class ByteComparator implements Comparator<Byte> { public int compare (Byte x, Byte y) { return (x - y); class Collections { public static <T> T max(collection<t> col, Comparator<T> cmp) { Iterator<T> it = col.iterator(); T elt = it.next(); while (it.hasnext()) { T elt2 = it.next(); if (cmp.compare(elt,elt2) < 0 ) elt = elt2; return elt;

Cours 6 - TEP - UPMC - 2008/2009 p. 20/34 Méthodes paramétrées (2) En O Caml http://caml.inria.fr/pub/docs/manual-ocaml/manual005.html : #class intlist (l : int list) = object method empty = (l = []) method fold : a. ( a -> int -> a) -> a -> a = fun f accu -> List.fold_left f accu l end;; #let l = new intlist [1; 2; 3];; val l : intlist = <obj> #l#fold (fun x y -> x+y) 0;; - : int = 6 #l#fold (fun s x -> s ˆ string_of_int x ˆ " ") "";; - : string = "1 2 3 "

Cours 6 - TEP - UPMC - 2008/2009 p. 21/34 Typage et sous-typage un type paramétré τ 2 < T 2 > τ 1 < T 1 > ssi : τ 2 τ 1 et T 2 = T 1 un type paramétré τ < T > τ un type paramétré τ < T > Object τ 2 < T 2 > n est pas sous-type de τ 1 < T 1 > si T 2 T 1

Cours 6 - TEP - UPMC - 2008/2009 p. 22/34 Redéfinition et surcharge (1) class QueueSR { Object m1(queues<string> q) throws Vide { System.out.println("QueueSR m1 QueueS<String>"); return q.partir(); Object m1(queues<integer> q) throws Vide { System.out.println("QueueSR m1 QueueS<Integer>"); return q.partir(); /* Object m1(queues q) { System.out.println("QueueSR m1 QueueS"); return q.partir(); */ public static void main(string[] args) { QueueSR sr = new QueueSR(); QueueS<String> q = new QueueS<String>(3); try { q.entrer("salut"); sr.m1(q); catch (Exception e) {

Cours 6 - TEP - UPMC - 2008/2009 p. 23/34 Redéfinition et surcharge (2) javac QueueSR.java QueueSR.java:4: name clash: m1(queues<java.lang.string>) and m1(queues<java.lang.integer>) have the same erasure Object m1(queues<string> q) throws Vide { ˆ QueueSR.java:9: name clash: m1(queues<java.lang.integer>) and m1(queues<java.lang.string>) have the same erasure Object m1(queues<integer> q) throws Vide { ˆ 2 errors

Cours 6 - TEP - UPMC - 2008/2009 p. 24/34 Polymorphisme borné sous-typage sur des types paramétrés : introduction d inconnues de types <?>? (wildcard) hérite d Object 2? sont différents (variables fraîches). 2 bornes : <? extends A> : inconnue sous type de A <? super A> : inconnue sur(per) type de A <?> <? extends Object> inconnue non instanciable pas de new A<?>()

Cours 6 - TEP - UPMC - 2008/2009 p. 25/34 Polymorphisme borné (2) API : ArrayList(Collection<? extends E> c) Constructs a list containing the elements of the specified collection, in the order they are returned by the collection s iterator. inférence de types pour la détermination des inconnues.

Exemple import java.util.*; class A<T> { T x; void set_x(t x) {this.x = x; T get_x() {return x; class B<T> extends A<T>{ T y; void set_y(t y) {this.y = y; T get_y() {return y; class H { public static void main(string[] a) { A<? extends B> v1 = new B<B>(); A<? extends A> v2 = v1; A<? extends Object> v3 = v2; A<? super A> v4 = new B<Object>(); A<? super B> v5 = v4; A<?> v6 = v5; Cours 6 - TEP - UPMC - 2008/2009 p. 26/34

Cours 6 - TEP - UPMC - 2008/2009 p. 27/34 Variances tableaux : covariance avec informations de types dans les valeurs S[] est sous-type de T[], si S est sous-type de T instance de classes paramétrées : covariance List<S> est sous-type de List<? extends T> si S est sous-type de T contravariance List<S> est sous-type de List<? super T> si S est sur-type de T

Cours 6 - TEP - UPMC - 2008/2009 p. 28/34 Exemple 2 (1) import java.util.arraylist; class Vide extends Exception { class Pleine extends Exception { public class QueueSW<A> { int taille, longueur; ArrayList<A> q; int tete, fin; QueueSW(int n) {taille = n; q = new ArrayList<A>(n); void entrer(a x) throws Pleine { if (longueur < taille) { q.add(fin++ % taille, else throw new Pleine(); x); longueur++; A partir() throws Vide { if (longueur > 0) { longueur--; return q.get(tete++ % taille); else throw new Vide();

Cours 6 - TEP - UPMC - 2008/2009 p. 29/34 Exemple 2 (2) class K { public static void main(string[] a){ try { QueueSW<Number> q1 = new QueueSW<Number>(5); q1.entrer(new Integer(3)); q1.entrer((number) new Integer(2)); q1.entrer(new Double (2.2)); // q1.entrer((object) new Integer(4)); Object o = q1.partir(); Number n = q1.partir(); // Integer x = q1.partir(); catch (Exception e) {

Cours 6 - TEP - UPMC - 2008/2009 p. 30/34 Compilation (1) infrence de types: sur les inconnues? capture (liaison) d un? avec un paramètre de type (<T>): liaison unique (en dehors du type de retour) et le type paramétré n est pas argument d un autre type paramétré aide à l inférence en indiquant explicitement les paramètres de type de retour

Cours 6 - TEP - UPMC - 2008/2009 p. 31/34 Compilation (2) code compatible 1.4 pas de changement de machine virtuelle remplace les types paramétrés par les types sans paramètres : pas d information du paramètre de type à l exécution ajoute des tests de typage dynamiques (warning) ne va pas plus vite limite les possibilités de debug

Cours 6 - TEP - UPMC - 2008/2009 p. 32/34 Compilation (3) papiers sur Pizza pour les techniques de compilation : monomorphisation : code spécialisé pour chaque paramètre de type instancié tests de typage dynamiques : code plus compact mais plus lent papiers sur le CLR de.net modifié pour intégrer les generics de C# la compatibilité Java coûte cher.

Cours 6 - TEP - UPMC - 2008/2009 p. 33/34 Autres lectures (1) livre de Wadler (O reilly) : Génériques et collections en Java cours de Forax (Mlv) : http://igm.univ-mlv.fr/ forax/ens/java-avance/cours/pdf/ cours de Barthélémy (Cnam) : http://deptinfo.cnam.fr/ barthe/oo/typage-genericite.pdf http://deptinfo.cnam.fr/ barthe/oo/ tutorial GJ : http://www.cis.unisa.edu.au:80/ pizza/gj/documents/gj-tutorial.pdf http://www.cis.unisa.edu.au:80/ pizza/gj/documents/

Cours 6 - TEP - UPMC - 2008/2009 p. 34/34 Autres lectures (2) tutorial Java 1.5 : http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf tutorial Pizza : http://pizzacompiler.sourceforge.net/doc/tutorial.html sur.net et les generics C#: http://research.microsoft.com/projects/clrgen/