Sie sind auf Seite 1von 22

Type gnrique

Supposons qu'on veut une seule classe d'lments dans une collection. On veut que le compilateur vrifie qu'on n'utilise la collection que pour une classe d'objets particulire car:
 

Une collection d objet peut tre une collection htrogne Exemple


   

Collection c = new ArrayList(); c.add(new(Integer(0)); String s = (String) c.get(0); c.add(new Date());

Solution (Java 1.4) : Crer une nouvelle classe spcifique. Chaque mthode vrifie la classe des objets dans la collection. Les casts sont caches.

public class TableauChat{ private ArrayList c; public TableauChat(){ c = new ArrayList(100); } public void add(Chat x){ c.add(x); }
public Chat get(int i) {

return (Chat)(c.get(i)); // que se passe-t-il si on oublie de caster ? } } public static void main(String[] args) { TableauChat t = new TableauChat(); Chat c = new Chat(1); t.add(c); t.get(0)); }

On aimerait pouvoir dfinir un patron de classe avec un ou plusieurs paramtres que l on pourrait instancier par le type d objets qui nous intresse Intrt


 

Les erreurs types sont immdiatement dtectes la compilation Simplification au niveau des casts Factorisation du code

Type gnrique: class Arraylist<E>


Pour utiliser un type gnrique il faut spcifi le paramtre. // Une collection d'objets ArrayList list = new ArrayList(); list.add(0, new Integer(42)); int total = ((Integer)list.get(0)).intValue(); // Une collection d'Integers ArrayList<Integer> list = new ArrayList<Integer>(); list.add(0, new Integer(42)); int total = list.get(0).intValue(); // Autoboxing list.add(0,42);

ArrayList<Integer> list = new ArrayList<Integer>(); list.add(0, new Integer(42)); list.add(1, new Double(2.9)); //erreur

Remarque:  Toutes les collections en Java 5 sont gnriques.




Interfaces et classes ont t remplaces par des versions gnriques

Exemple de classes gnriques


class Paire<A>{ private A elem1,elem2 ; public Paire(A elem1, A elem2 ){ this.elem1=elem1; this.elem2=elem2; } public A getElem1(){ return elem1 ; } public A getElem2(){ return elem2; } public Paire<A> echange(){ return new Paire<A>(elem2,elem1); } } Paire<String> p1=new Paire<String> ( premier , second ); String s=p1.getElem1(); Paire<Integer> p2=new Paire<Integer> (123,456); p2.echange(); Paire<Float> p3=p2; // erreur

Exemple avec des paires d lments de type diffrents


public class MyGeneric <X,Y> { private X premier; private Y second; public MyGeneric(X a1, Y a2) { premier = a1; second = a2; } public X getPremier() { return premier; } public Y getSecond() { return second; } public void setPremier(X arg) { premier = arg; } public void setSecond(Y arg) { second = arg; } public String toString() { return premier + " " + second; } } public static void main(String args[]) { MyGeneric<String,Integer> a = new MyGeneric<String,Integer>("Hello",1); a.setPremier("Bonjour"); a.setSecond(2); System.out.println(a); }

(montrer exemple MyGeneric.java)

Wildcards (jokers)
Une mthode: void afficheCollection(Collection c){ Iterator it=c.iterator(); while (it.hasNext()) System.out.println(it.next()); }  Comment rcrire cette mthode avec des collections gnriques ?

On utilise un wildcard pour indiquer que le type du paramtre est n'importe quelle instance de Collection<T>: void afficheCollection(Collection<?> c){ Iterator it=c.iterator(); while (it.hasNext()) System.out.println(it.next()); }

Exemple
MyGeneric<?,?> b; b = new MyGeneric<String,Integer>("Salut",3); System.out.println(b); b = new MyGeneric<Double,String>(4.9,"Ciao"); System.out.println(b); public static void imprimer (MyGeneric<?,?> m){ System.out.println(m); } imprimer(b);

l'interface Collection


Interface Collection<E>


public interface Collection<E>extends Iterable<E>

l'interface Iterable contient une seule methode iterator();




les classes qui implmentent cette interface peuvent tre utilises:


 

Itrateur gnrique avec la nouvelle boucle for

Avant: List l=new ArrayList(); Etudiant e=new Etudiant(); l.add(e); ... for (Iterator it=l.iterator();it.hasNext();){ e=(Etudiant) it.next(); e.affiche(); }

Avec les classes gnriques: List<Etudiant> l=new ArrayList<Etudiant>(); Etudiant e=new Etudiant(); l.add(e); l.add(new Point()) //rejet la compilation! ... for (Iterator<Etudiant> it =l.iterator<Etudiant>(); it.hasNext();){ (it.next()).affiche(); // casting inutile } (montrer exemple iteratorgenerique.java)

Nouvelle boucle for


Nouvelle syntaxe autorise pour allger l criture de boucles List l=new ArrayList( ); ... for (Iterator it=l.iterator();l.hasNext();) (Etudiant)(it.next()).affiche(); ... Version java 1.5: List<Etudiant> l=new ArrayList<Etudiant>( ); ... for (Etudiant e: l) e.affiche(); ...  Cette possibilit est offerte toute classe (de collection) qui implmente l'interface Iterable<T> (mthode Iterator<T> iterator(); )

Emballage et dballage pour les classes enveloppes des types primitifs




Rappel : chacun des types primitifs de Java (boolean, byte, short, int, long, float, double, char) correspond une classe enveloppe (Boolean, Byte, etc ). Chaque instance d une de ces classes enveloppe correspond une unique donne membre du type associ. Inconvnient : emballage et dballage

Exemple : int valeur=5; ... Integer obji=new Integer(valeur) ; // emballage ... int n=obji.intValue(); // dballage

Nouveaut: emballage/dballage automatiques int valeur=5 ; Integer obji=valeur ; int n=obji ;

Mthodes gnriques
Exemple : public static<T> void permute(T[] tab, int i,int j){ T temp=tab[i] ; tab[i]=tab[j] ; tab[j]=temp ; } ... String[] tabnoms; Float[] tabflott; ... C.permute(tabnoms,13,4); C.permute(tabflott,4,2);


Une mthode paramtre par un type gnrique

Dclaration d une classe qui hrite d une autre


Exemple: Une classe qui drive d une classe gnrique (on peut instancier avec n'importe quelle classe qui implante Comparable) public class X <E> extends Comparable<E> { ... public static void main (String args []){ X<String> s = new X<String>(); } }



X<String> drive de la classe Comparable<String>

Remarque


Compatibilit avec les anciennes version de Java est maintenue grce au type raw


Il s agit d un type gnrique sans argument de type

Pour en savoir plus sur les types gnriques  http://java.sun.com/j2se/1.5/pdf/gen erics-tutorial.pdf




http://www.angelikalanger.com/GenericsF AQ/JavaGenericsFAQ.html

Das könnte Ihnen auch gefallen