conception orient´ee objetroutier/enseignement/...xxx.drawall(thecircles); // ne compile pas,...

16
Classes et m´ ethodes g´ en´ eriques Typage Types g´ en´ eriques Conception Orient´ ee Objet Jean-Christophe Routier Licence mention Informatique Universit´ e Lille 1 Universit´ e Lille 1 - Licence Informatique Conception Orient´ ee Objet 1

Upload: others

Post on 20-Feb-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Conception Orient´ee Objetroutier/enseignement/...xxx.drawAll(theCircles); // ne compile pas, mˆeme raison Universit´e Lille 1 - Licence Informatique Conception Orient ´ee Objet

Classes et methodes generiques Typage

Types generiques

Conception Orientee Objet

Jean-Christophe RoutierLicence mention Informatique

Universite Lille 1

Universite Lille 1 - Licence Informatique Conception Orientee Objet 1

Page 2: Conception Orient´ee Objetroutier/enseignement/...xxx.drawAll(theCircles); // ne compile pas, mˆeme raison Universit´e Lille 1 - Licence Informatique Conception Orient ´ee Objet

Classes et methodes generiques Typage

Les collections

Rappel : les collections sont typees : utilisation des types generiques.I Collection<E>, List<E>, Set<E>

type parametre

On fixe le type des elements a la construction :

List<String> l = new ArrayList<String>();Collection<Hobbit> c = new HashSet<Hobbit>();

renforcement du typage :controle a la compilation

code plus sur

(a partir de java 1.5)

Universite Lille 1 - Licence Informatique Conception Orientee Objet 2

Page 3: Conception Orient´ee Objetroutier/enseignement/...xxx.drawAll(theCircles); // ne compile pas, mˆeme raison Universit´e Lille 1 - Licence Informatique Conception Orient ´ee Objet

Classes et methodes generiques Typage

Autre exemple

L’interface java.lang.Comparable :

java.lang.Comparable<T>

public int compareTo(T o)

ou T represente le type des elements compares.

Implementation :public class String implements Comparable<String>, ....

Universite Lille 1 - Licence Informatique Conception Orientee Objet 3

Page 4: Conception Orient´ee Objetroutier/enseignement/...xxx.drawAll(theCircles); // ne compile pas, mˆeme raison Universit´e Lille 1 - Licence Informatique Conception Orient ´ee Objet

Classes et methodes generiques Typage

Effacement de type

de java.sun.com

Generics are implemented by type erasure: generic type information ispresent only at compile time, after which it is erased by the compiler.The main advantage of this approach is that it provides totalinteroperability between generic code and legacy code that usesnon-parameterized types (which are technically known as raw types).The main disadvantages are that parameter type information is notavailable at run time, and that automatically generated casts may fail wheninteroperating with ill-behaved legacy code.

Difference avec C++ ou les templates produisent des nouvelles classes.

Universite Lille 1 - Licence Informatique Conception Orientee Objet 4

Page 5: Conception Orient´ee Objetroutier/enseignement/...xxx.drawAll(theCircles); // ne compile pas, mˆeme raison Universit´e Lille 1 - Licence Informatique Conception Orient ´ee Objet

Classes et methodes generiques Typage

Creer un type generique

Le type generique, T, apparaıt dans la declaration de classe.

package value;public class Value<T> {

private T v;public Value (T v){

this.v = v;}public T getValue() {

return this.v;}

}// Value

Usage :

Value<Integer> v1 = new Value<Integer>(12);Value<List<Chou>> v2 = new Value<List<Chou>>(new ArrayList<Chou>());Integer i = v1.getValue();

Universite Lille 1 - Licence Informatique Conception Orientee Objet 5

Page 6: Conception Orient´ee Objetroutier/enseignement/...xxx.drawAll(theCircles); // ne compile pas, mˆeme raison Universit´e Lille 1 - Licence Informatique Conception Orient ´ee Objet

Classes et methodes generiques Typage

I On veut definir une classe permettant de lier des identifiants (String)a des valeurs (Value).

I Le type des valeurs est inconnu a priori.↪→ comment le declarer ?↪→ comment signifier “une valeur quelconque” ?

Utilisation de joker (wildcard) : ?.Value<?>

Universite Lille 1 - Licence Informatique Conception Orientee Objet 6

Page 7: Conception Orient´ee Objetroutier/enseignement/...xxx.drawAll(theCircles); // ne compile pas, mˆeme raison Universit´e Lille 1 - Licence Informatique Conception Orient ´ee Objet

Classes et methodes generiques Typage

package value;public class Context {

private Map<String,Value<?>> lesVariables;public Context() {

this.lesVariables = new HashMap<String,Value<?>>();}public void addVariable(String id, Value<?> var) {

this.lesVariables.put(id, var);}public Value<?> getVariable(String id) {

return this.lesVariables.get(id);}

//=================================================public static void main(String[] args) {

Context c = new Context();c.addVariable("v1", new Value<Integer>(12));c.addVariable("v2", new Value<Boolean>(true));S.o.p("v1: "+c.getVariable("v1").getClass());S.o.p("v2: "+c.getVariable("v2").getValue().getClass());

}}// Context

+---------------------| v1: class value.Value| v2: class java.lang.Boolean|

Universite Lille 1 - Licence Informatique Conception Orientee Objet 7

Page 8: Conception Orient´ee Objetroutier/enseignement/...xxx.drawAll(theCircles); // ne compile pas, mˆeme raison Universit´e Lille 1 - Licence Informatique Conception Orient ´ee Objet

Classes et methodes generiques Typage

Methode generique

methode parametree par un type

Dans la classe Context ajouter une methode addVariableValue quiI permet d’ajouter une variable a partir d’une valeur,I et donc prend en parametre l’identifiant et la valeur de la variable a

ajouterLa valeur est donc du type T, pour une valeur Value<T> a creer.

public <T> void addVariableValue(String id,T value) {Value<T> v = new Value<T>(value);this.addVariable(id, v);

}//------------------------------------------Context c = new Context();c.addVariableValue("var3",12);c.addVariableValue("var4",true);c.addVariableValue("var5", new Carotte(...));

Universite Lille 1 - Licence Informatique Conception Orientee Objet 8

Page 9: Conception Orient´ee Objetroutier/enseignement/...xxx.drawAll(theCircles); // ne compile pas, mˆeme raison Universit´e Lille 1 - Licence Informatique Conception Orient ´ee Objet

Classes et methodes generiques Typage

Difficultes lies au typage

I ArrayList<String> est un sous-type de Collection<String>

I Collection<String> n’est pas un sous-type de Collection<Object>

Consequence,Collection<Hobbit> colHob = new ArrayList<Hobbit>(); // okCollection<Object> c = new ArrayList<Hobbit>(); // ne compile pas !!!Collection<Object> c = colHob; // idem : incompatible types

et donc, soit :public void dump(Collection<Object> c) {

for (Object o : c) {System.out.println(o);

}}

ne peut pas prendre pour parametre autre chose que Collection<Object>.xxx.dump(new ArrayList<Hobbit>()) ne compile pas !

I Collection<Object> ne signifie pas“n’importe quelle collection pourvu qu’elle contienne des objets”mais bien “collection d’Objects”

Universite Lille 1 - Licence Informatique Conception Orientee Objet 9

Page 10: Conception Orient´ee Objetroutier/enseignement/...xxx.drawAll(theCircles); // ne compile pas, mˆeme raison Universit´e Lille 1 - Licence Informatique Conception Orient ´ee Objet

Classes et methodes generiques Typage

I Comment exprimer “n’importe quelle collection” ?cad le type qui reunit toutes les collections

Collection<?>

package value;import java.util.*;public class Context {

private Map<String,Value<?>> lesVariables;public Context() {

this.lesVariables = new HashMap<String,Value<?>>();}public void addVariable(String id, Value<?> var) {

this.lesVariables.put(id, var);}public Value<?> getVariable(String id) {

return this.lesVariables.get(id);}

}// Context

Universite Lille 1 - Licence Informatique Conception Orientee Objet 10

Page 11: Conception Orient´ee Objetroutier/enseignement/...xxx.drawAll(theCircles); // ne compile pas, mˆeme raison Universit´e Lille 1 - Licence Informatique Conception Orient ´ee Objet

Classes et methodes generiques Typage

Collection<?> (collection d’inconnus, ? = joker)

mais la seule garantie sur les elements c’est que ce sont des Objects

public void dump(Collection<?> c) {for (Object o : c) {

System.out.println(o);}

}

xxx.dump(new ArrayList<Hobbit>()) est legal.Mais :

Collection<?> c = new ArrayList<Hobbit>();c.add(new Hobbit(...)); // ne compile pas

Universite Lille 1 - Licence Informatique Conception Orientee Objet 11

Page 12: Conception Orient´ee Objetroutier/enseignement/...xxx.drawAll(theCircles); // ne compile pas, mˆeme raison Universit´e Lille 1 - Licence Informatique Conception Orient ´ee Objet

Classes et methodes generiques Typage

public void drawAll(Collection<Shape> c) {for (Shape o : c) {

o.draw();}

}

� interface �Shape

+ draw()+ rotate()+ ...

permet :

List<Shape> theShapes = new ArrayList<Shape>();xxx.drawAll(theShapes); // ok

mais pas :

// Circle implements ShapeList<Circle> theCircles = new ArrayList<Circle>();xxx.drawAll(theCircles); // ne compile pas, meme raison

Universite Lille 1 - Licence Informatique Conception Orientee Objet 12

Page 13: Conception Orient´ee Objetroutier/enseignement/...xxx.drawAll(theCircles); // ne compile pas, mˆeme raison Universit´e Lille 1 - Licence Informatique Conception Orient ´ee Objet

Classes et methodes generiques Typage

Comment exprimer :

une collection de n’importe quoi du moment que c’est une Shapecad du moment que c’est un sous-type de Shape

Collection<? extends Shape>

On a alors :

public void drawAll(Collection<? extends Shape> c) {for (Shape s : c) {

s.draw();}

}

et alors xxx.drawAll(new ArrayList<Circle>()) est legal.

Universite Lille 1 - Licence Informatique Conception Orientee Objet 13

Page 14: Conception Orient´ee Objetroutier/enseignement/...xxx.drawAll(theCircles); // ne compile pas, mˆeme raison Universit´e Lille 1 - Licence Informatique Conception Orient ´ee Objet

Classes et methodes generiques Typage

super

Il existe super pour reclamer un type plus general.

Syntaxe interpretation? n’importe quel type

? extends T n’importe quel sous-type de T? super T n’importe quel super-type de T

Regle PECS : “Producer extends, Consumer super”

Universite Lille 1 - Licence Informatique Conception Orientee Objet 14

Page 15: Conception Orient´ee Objetroutier/enseignement/...xxx.drawAll(theCircles); // ne compile pas, mˆeme raison Universit´e Lille 1 - Licence Informatique Conception Orient ´ee Objet

Classes et methodes generiques Typage

PECS

Exemples :I dans List<E> :

boolean addAll(Collection<? extends E> c)

I dans Collections :static <T> void sort(List<T> list, Comparator<? super T> c)

I dans Collections :static <T> void copy(List<? super T> dest, List<? extends T> src)

Universite Lille 1 - Licence Informatique Conception Orientee Objet 15

Page 16: Conception Orient´ee Objetroutier/enseignement/...xxx.drawAll(theCircles); // ne compile pas, mˆeme raison Universit´e Lille 1 - Licence Informatique Conception Orient ´ee Objet

Classes et methodes generiques Typage

Combinaison de types

Possibilite de preciser “plusieurs bornes” aux jokers a l’aide de l’operateur &.

Par exemple, si avec addVariable, on veut que les valeurs ajoutees soient ala fois des Shape et Clonable, alors on peut ecrire :

public <T extends Shape & Clonable> void addVariable(String id,T value)

Universite Lille 1 - Licence Informatique Conception Orientee Objet 16