Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Java Generics Davide Ficano [email_address]
Le collezioni di oggetti <ul><li>Java mette a disposizione classi per contenere oggetti </li></ul><ul><ul><li>Liste,Vettor...
Object e le collezioni <ul><li>Object è la superclasse  implicita  di qualunque oggetto </li></ul><ul><li>Object è un tipo...
Difetti delle collezioni di Object <ul><li>Utilizzando queste classi ci si rende subito conto che </li></ul><ul><ul><li>si...
Generics Polimorfismo Parametrico <ul><li>Per risolvere i problemi citati in Java 1.5 è stato introdotto il concetto di  G...
Generics Un esempio <ul><li>Vector<String> v =  new  Vector<String>(); </li></ul><ul><li>v.add( &quot;Polly&quot; ); </li>...
Sintassi /1 Definizione <ul><li>La nuova sintassi prevede la forma Vector<E> </li></ul><ul><li>La E tra parentesi angolari...
Sintassi /2 Metodi <ul><li>La classe Vector ha dei metodi che devono lavorare con i generics ad esempio add() </li></ul><u...
Generics Non solo Vector <ul><li>Vector è solo un esempio, i generics possono essere usati ad esempio sugli oggetti java.u...
Generics e valori di ritorno <ul><li>Gli Identificatori  generics  possono  restituire come valore di ritorno una classe p...
Esempi di iterators <ul><li>Iterator i = v.iterator(); </li></ul><ul><li>while  (i.hasNext()) { </li></ul><ul><li>String s...
Generics definiti dall'utente <ul><li>I Generics non sono soltato utilizzate dal JDK </li></ul><ul><li>Possono essere usat...
Classe parametrica <ul><li>Linea 1: La classe viene dichiarata con due tipi generics </li></ul><ul><li>Gli attributi ed i ...
Utilizzo classe Coppia <ul><li>Cane c =  new  Cane( &quot;Fido&quot; ); </li></ul><ul><li>Coppia<String, Cane> nome1; </li...
Peculiarità dei generics /1 <ul><li>Tutte le istanze di una classe generica condividono la stessa classe di base, anche se...
Peculiarità dei generics /2 <ul><li>Non è possibile assegnare un'istanza di una classe parametrica ad un reference con tip...
Type safety sicurezza nell'assegnamento dei tipi <ul><li>Se una simile operazione fosse consentita, si otterrebbero due re...
Collezioni di tipo sconosciuto <ul><li>Abbiamo visto che se si desidera definire una Collection in grado di accettare  qua...
Utilizzo /1 <ul><li>Il codice riportato di seguito </li></ul><ul><ul><li>crea due vettori che contengono rispettivamente  ...
Utilizzo /2 Upper bound <ul><li>Il metodo stampaAnimali deve essere reso capace di gestire la gerarchia Animale </li></ul>...
Utlizzo /3 Lower bound <ul><li>Molto meno usato del precedente, il lower bound permette di ricevere solo oggetti di un cer...
Upcoming SlideShare
Loading in …5
×

Java Generics

3,450 views

Published on

Introduzione ai Generics in Java

Published in: Technology

Java Generics

  1. 1. Java Generics Davide Ficano [email_address]
  2. 2. Le collezioni di oggetti <ul><li>Java mette a disposizione classi per contenere oggetti </li></ul><ul><ul><li>Liste,Vettori </li></ul></ul><ul><ul><li>HashTable </li></ul></ul><ul><ul><li>Set </li></ul></ul><ul><li>Sino a Java 1.4 queste classi lavoravano solo con Object, a partire da Java 1.5 e' stato introdotta una nuova sintassi </li></ul>
  3. 3. Object e le collezioni <ul><li>Object è la superclasse implicita di qualunque oggetto </li></ul><ul><li>Object è un tipo generico , dal momento che qualunque classe è un Object </li></ul><ul><li>Grazie a questa proprietà di Object, è possibile creare oggetti di dimensione variabile come Vector </li></ul>
  4. 4. Difetti delle collezioni di Object <ul><li>Utilizzando queste classi ci si rende subito conto che </li></ul><ul><ul><li>si ha la necessità di ricorrere al casting per recuperare gli oggetti presenti nel contenitore </li></ul></ul><ul><ul><li>non esiste nessun controllo sul tipo di oggetti che effettivamente vengono inseriti nel Vector; se per errore si inserisce in v un oggetto diverso da String, la cosa verrà notata soltanto in fase di esecuzione </li></ul></ul><ul><li>Vector v = new Vector(); </li></ul><ul><li>v.add( &quot;Polly&quot; ); </li></ul><ul><li>// necessario il cast </li></ul><ul><li>String s = (String)v.get(0); </li></ul><ul><li>Vector v = new Vector(); </li></ul><ul><li>v.add( &quot;Polly&quot; ); </li></ul><ul><li>// ClassCastException </li></ul><ul><li>Long l = (Long)v.get(0); </li></ul>
  5. 5. Generics Polimorfismo Parametrico <ul><li>Per risolvere i problemi citati in Java 1.5 è stato introdotto il concetto di Generics </li></ul><ul><li>I Generics hanno una nuova sintassi </li></ul><ul><li>Il tipo della collezione si dichiara in fase di definizione dell'oggetto </li></ul><ul><li>Errori di assegnazioni a oggetti non corretti vengono segnalati in fase di compilazione anziché in fase di esecuzione </li></ul>
  6. 6. Generics Un esempio <ul><li>Vector<String> v = new Vector<String>(); </li></ul><ul><li>v.add( &quot;Polly&quot; ); </li></ul><ul><li>// Nessun cast necessario </li></ul><ul><li>String s = v.get(0); </li></ul><ul><li>// da errore di compilazione </li></ul><ul><li>Long l = v.get (0); </li></ul><ul><li>Vector v = new Vector(); </li></ul><ul><li>v.add( &quot;Polly&quot; ); </li></ul><ul><li>// necessario il cast </li></ul><ul><li>String s = (String)v.get(0); </li></ul>Senza Generics Con Generics
  7. 7. Sintassi /1 Definizione <ul><li>La nuova sintassi prevede la forma Vector<E> </li></ul><ul><li>La E tra parentesi angolari denota un Tipo Parametrico deciso dall'utilizzatore </li></ul><ul><li>Grazie alla nuova sintassi il controllo sui tipi viene effettuato dal compilatore </li></ul><ul><li>Vector<String> v = new Vector<String>(); </li></ul><ul><li>v.add( &quot;Polly&quot; ); </li></ul><ul><li>v.add(new Integer(10)) ; // da errore di compilazione </li></ul><ul><li>String s = v.get(0); // Nessun cast necessario </li></ul><ul><li>Long l = v.get (0); // da errore di compilazione </li></ul>
  8. 8. Sintassi /2 Metodi <ul><li>La classe Vector ha dei metodi che devono lavorare con i generics ad esempio add() </li></ul><ul><li>I metodi vengono dichiarati utilizzando il meta tipo </li></ul>boolean add(E o) // prende in ingresso un generic E get( int index) // restituisce un generic <ul><li>Il simbolo E verrà sostituito automaticamente con il tipo dichiarato in fase di creazione </li></ul><ul><li>Vector<String> v = new Vector<String>(); </li></ul><ul><li>v.add( &quot;Polly&quot; ); </li></ul>
  9. 9. Generics Non solo Vector <ul><li>Vector è solo un esempio, i generics possono essere usati ad esempio sugli oggetti java.util.Map </li></ul><ul><li>HashMap lavora con la coppia chiave, valore che vengono gestiti entrambi come generics </li></ul><ul><ul><li>HashMap<K,V> </li></ul></ul><ul><li>HashMap<Integer, String> map = new HashMap<Integer, String>(); </li></ul><ul><li>map.put(10, &quot;dieci&quot; ); </li></ul><ul><li>map.put(20, &quot;venti&quot; ); </li></ul><ul><li>String s = map.get(10); </li></ul>
  10. 10. Generics e valori di ritorno <ul><li>Gli Identificatori generics possono restituire come valore di ritorno una classe parametrica dello stesso tipo di quello dichiarato al costruttore. </li></ul><ul><li>Il &quot;vecchio&quot; iterator() public Iterator iterator() diventa public Iterator<E> iterator() </li></ul><ul><li>Questo permette di avere iterators che non necessitano di casting </li></ul>
  11. 11. Esempi di iterators <ul><li>Iterator i = v.iterator(); </li></ul><ul><li>while (i.hasNext()) { </li></ul><ul><li>String s = (String)i.next(); </li></ul><ul><li>System. out .println(s); </li></ul><ul><li>} </li></ul><ul><li>Iterator<String> i = v.iterator(); </li></ul><ul><li>while (i.hasNext()) { </li></ul><ul><li>String s = i.next(); </li></ul><ul><li>System. out .println(s); </li></ul><ul><li>} </li></ul>Senza Generics Con Generics
  12. 12. Generics definiti dall'utente <ul><li>I Generics non sono soltato utilizzate dal JDK </li></ul><ul><li>Possono essere usati per creare proprie classi </li></ul><ul><li>Vediamo in dettaglio come funziona </li></ul>
  13. 13. Classe parametrica <ul><li>Linea 1: La classe viene dichiarata con due tipi generics </li></ul><ul><li>Gli attributi ed i metodi fanno riferimento al meta tipo </li></ul><ul><li>public class Coppia<K, V> { </li></ul><ul><li>private K k ; </li></ul><ul><li>private V v ; </li></ul><ul><li>public Coppia(K k, V v) { </li></ul><ul><li>this . k = k; </li></ul><ul><li>this . v = v; </li></ul><ul><li>} </li></ul><ul><li>public K getKey(){ return k ; } </li></ul><ul><li>public V getValue(){ return v ; } </li></ul><ul><li>} </li></ul>
  14. 14. Utilizzo classe Coppia <ul><li>Cane c = new Cane( &quot;Fido&quot; ); </li></ul><ul><li>Coppia<String, Cane> nome1; </li></ul><ul><li>nome1 = new Coppia<String, Cane>(c.getNome(), c); </li></ul><ul><li>Anatra a = new Anatra( &quot;Paperino&quot; ); </li></ul><ul><li>Coppia<String, Anatra> nome2; </li></ul><ul><li>nome2 = new Coppia<String, Anatra>(a.getNome(), a); </li></ul><ul><li>La classe Coppia rappresenta un oggetto con tue valori </li></ul><ul><li>Vengono creati due oggetti </li></ul>
  15. 15. Peculiarità dei generics /1 <ul><li>Tutte le istanze di una classe generica condividono la stessa classe di base, anche se vengono specializzate in modo differente. </li></ul><ul><li>Coppia<String, Cane> nome1 = new Coppia<String, Cane>(...); </li></ul><ul><li>Coppia<String, Anatra> nome2 new Coppia<String, Anatra>(...); </li></ul><ul><li>Ci si aspetta che le due classi siano diverse per tipo ma esse condividono la stessa classe base quindi il confronto </li></ul><ul><ul><li>nome1.getClass() == nome2.getClass() </li></ul></ul><ul><li>ritorna true </li></ul>
  16. 16. Peculiarità dei generics /2 <ul><li>Non è possibile assegnare un'istanza di una classe parametrica ad un reference con tipo parametrico più generico </li></ul>Vector<String> v1 = new Vector<String>(); Vector<Object> v2 = v1; // errore di compilazione <ul><li>Domanda 1: Perchè questo non è consentito? </li></ul><ul><li>Domanda 2: E' un difetto oppure un vantaggio? </li></ul>
  17. 17. Type safety sicurezza nell'assegnamento dei tipi <ul><li>Se una simile operazione fosse consentita, si otterrebbero due reference di tipo parametrico diverso che puntano allo stesso Vector di String. </li></ul><ul><li>Potremmo inserire all'interno di tale vettore oggetti differenti da String usando il reference v2: </li></ul><ul><li>v2.add(new Object); // violazione della type safety </li></ul>
  18. 18. Collezioni di tipo sconosciuto <ul><li>Abbiamo visto che se si desidera definire una Collection in grado di accettare qualunque tipo , non possiamo usare Vector<Object> </li></ul><ul><li>Essa denota una Collection in grado di accettare unicamente oggetti di tipo Object </li></ul><ul><li>Per risolvere quello problema è possibile definire generics di tipo parametrico sconosciuto </li></ul><ul><li>Questo si fa utilizzando il carattere '?' (punto interrogativo) </li></ul>
  19. 19. Utilizzo /1 <ul><li>Il codice riportato di seguito </li></ul><ul><ul><li>crea due vettori che contengono rispettivamente solo Cani e solo Anatre (ricordiamo che entrambi gli oggetti estendono la classe Animale) </li></ul></ul><ul><ul><li>chiama un metodo in grado di stampare oggetti di tipo Animale </li></ul></ul><ul><li>Sappiamo, per quanto detto prima, che Vector<Animale> accetta solo Animale e non sue classi derivate </li></ul>Vector<Cane> cani = new Vector<Cane>(); Vector<Anatra> anatre = new Vector<Anatra>(); t.stampaAnimali(cani); // errore di compilazione t.stampaAnimali(anatre); // errore di compilazione public void stampaAnimali(Vector<Animale> c) { ... }
  20. 20. Utilizzo /2 Upper bound <ul><li>Il metodo stampaAnimali deve essere reso capace di gestire la gerarchia Animale </li></ul><ul><li>Si utilizza la tecnica upper bound che permette di ricevere elementi di tipo Animale e di tutte le sue sottoclassi </li></ul><ul><li>La sintassi utilizza il wildcard e la parola extends </li></ul>public void stampaAnimali(Vector<? extends Animale> c) { ... }
  21. 21. Utlizzo /3 Lower bound <ul><li>Molto meno usato del precedente, il lower bound permette di ricevere solo oggetti di un certo tipo o di una sua superclasse </li></ul><ul><li>La sintassi utilizza il wildcard e la parola super </li></ul>public void stampaCani(Vector<? super Cane> c) { ... }

×