![](//s1.studylibfr.com/store/data-gzf/9831ba526d0be7cf3c7edde2ac7b2352/1/004137674.htmlex.zip/bg3.jpg)
Types g´
en´
eriques
Exemples : les collections dans java 1.5
Possibilit´
e de d´
efinir des collections typ´
ees
List<String> l = new ArrayList<String>();
l.add("timoleon");
l.add("bilbo");
l.add("Smaug");
// l.add(new Integer(1)); // ne compile pas
Iterator<String> i = l.iterator();
while(i.hasNext()) {
String s = i.next(); // pas de cast n´
ecessaire
System.out.println("> "+s);
}
String value = l.remove(0); // pas de cast n´
ecessaire
System.out.println(value+" removed");
for(String s : l) {// pas de cast n´
ecessaire
System.out.println("> "+s);
}
USTL http://www.lifl.fr/∼routier 13
Types g´
en´
eriques
Sous-types et g´
en´
eriques
Collection<String> n’est pas un sous-type de Collection<Object>
ArrayList<String> est un sous-type de Collection<String>
Cons´
equence, soit :
public void dump(Collection<Object> c) {
for (Object o : c) {
System.out.println(o);
}
}
ne peut pas prendre pour param`
etre autre chose qu’une Collection<Object>
xxx.dump(new ArrayList<Hobbit>()) ne compile pas !
Collection<Object> ne signifie pas
“n’importe quelle collection pourvue qu’elle contienne des objets”
mais bien “collection d’Objects”
USTL http://www.lifl.fr/∼routier 14
Types g´
en´
eriques
Jokers
Comment exprimer “n’importe quelle collection” ?
c`
ad le supertype de toutes les collections
Collection<?> (collection d’inconnus)
La seule garantie sur les ´
el´
ements 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 l´
egal.
Mais :
Collection<?> c = new ArrayList<Hobbit>();
c.add(new Hobbit(...)); // ne compile pas, mauvais typage de add
(inf´
erence de type)
USTL http://www.lifl.fr/∼routier 15
Types g´
en´
eriques
Joker born´
e
public abstract class Shape {public abstract void draw(Canvas c); }
public class Circle extends Shape {
public void draw(Canvas c) {... }
}
public class Rectangle extends Shape {
public void draw(Canvas c) {... }
}
public class Canvas {
public void draw(Shape s) {s.draw(this); }
}
Quelle signature pour une m´
ethode drawAll qui dessine toutes les Shapes :
public void drawAll(???? shapes){
for (Shape s : shapes) {s.draw(this); }
}
drawAll(List<Shape> shapes) est trop pr´
ecis : car refuse List<Circle>
drawAll(List<?> shapes) est trop vague, car accepte List<String>
Ce que l’on veut : “Collection de n’importe quoi de type Shape”
drawAll(List<? extends Shape> shapes)
NB : extends mˆ
eme pour interfaces, super existe aussi
USTL http://www.lifl.fr/∼routier 16
Types g´
en´
eriques
Cr´
eer un type g´
en´
erique
package value;
public class Value<T> {
private Tv;
public Value (Tv){
this.v = v;
}
public TgetValue() {
return this.v;
}
}// Value
package value;
public class Context {
private Map<String,Value> lesVariables;
public Context() {
lesVariables = new HashMap<String,Value>();
}
public void addVariable(String id, Value var) {
lesVariables.put(id, var);
}
public Value getVariable(String id) {
return 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
Trace :
v1: class value.Value
v2: class java.lang.Boolean
USTL http://www.lifl.fr/∼routier 17
Types g´
en´
eriques
M´
ethode g´
en´
erique
m´
ethode param´
etr´
ee par un type
Dans la classe Context ajouter une m´
ethode addValue qui prend l’identifiant et
une valeur du type qui param`
etre Value<T> :
public <T> void addValue(String id,Tvalue) {
Value<T> v = new Value<T>(value);
this.addVariable(id, v);
}
//------------------------------------------
Context c = new Context();
c.addValue("var3",10);
c.addValue("var4",true);
USTL http://www.lifl.fr/∼routier 18