ARRAYLIST. Programmazione con Java ArrayList e Generics 2 08/06/2014. Daniela Micucci daniela.micucci@unimib.it



Похожие документы
SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

20. Appunti sulle liste (gestione in linguaggio C#) 16/04/2015 Arraylist

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Modulo 4: Ereditarietà, interfacce e clonazione

Programmazione a Oggetti Lezione 10. Ereditarieta

Le variabili. Olga Scotti

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Realizzazione di una classe con un associazione

Introduzione. Java. Composizione. Esempio -- composizione. G. Prencipe È qualcosa che abbiamo già visto varie volte

Java: Compilatore e Interprete

L ambizione dei design pattern (letteralmente schemi di programmazione) è quella di offrire soluzioni a problemi ricorrenti che facilitano lo

Variabili e tipi di dato

QUEUE : considerazioni. QUEUE : considerazioni. QUEUE : esempio. QUEUE : esempio

Algoritmi e Strutture Dati. Tipo di dato astratto e Strutture dati elementari

Uno dei pregi di Java è quello di integrare la documentazione con il codice stesso Formato dei commenti:

Tricks & Tips. [Access] Tutorial - ActiveX - Controllo Tree View. - Michele de Nittis - Versione: 1 Data Versione: venerdì 30 agosto 2002

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

dall argomento argomento della malloc()

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

I file di dati. Unità didattica D1 1

Funzioni in C. Violetta Lonati

Organizzazione degli archivi

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Funzioni. Il modello console. Interfaccia in modalità console

Esercizi della lezione 5 di Java

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Inizializzazione, Assegnamento e Distruzione di Classi

Programmazione in Java (I modulo) Lezione 3: Prime nozioni

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Introduzione alla programmazione in C

costruttori e distruttori

GESTIONE INFORMATICA DEI DATI AZIENDALI

Fondamenti di Informatica C Esercitazioni di Laboratorio / 3 Outline

Programmazione in Java Parte I: Fondamenti

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

Struttura di un programma Java

esercizi Esercizi / problemi

Concetto di Funzione e Procedura METODI in Java

Esercitazione n 4. Obiettivi

4. Un ambiente di sviluppo per Java

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Programmazione ad Oggetti Modulo A (Esame del 11/9/2015)

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Parola chiave extends

10 - Programmare con gli Array

Synchronized (ancora)

Regione Toscana. ARPA Fonte Dati. Manuale Amministratore. L. Folchi (TAI) Redatto da

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Archivio CD. Fondamenti di Programmazione

Programmazione Java: Variabili membro, Metodi La parola chiave final

Esempi di esercizi d esame

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

Supermarket Progetto di Programmazione Febbraio 2010

Linguaggio C. Fondamenti. Struttura di un programma.

Allocazione dinamica della memoria - riepilogo

Alcune regole di base per scrivere un programma in linguaggio C

Prof. Pagani Corrado ESERCITAZIONI DIAGRAMMI DELLE CLASSI UML E JAVA

Test di unità con JUnit4

Uso di base delle funzioni in Microsoft Excel

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

Soluzioni degli esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

Prova di Laboratorio di Programmazione

STAMPA UNIONE DI WORD

WG-TRANSLATE Manuale Utente WG TRANSLATE. Pagina 1 di 15

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Introduzione a Classi e Oggetti

Gestione della memoria. Paginazione Segmentazione Segmentazione con paginazione

Algoritmi e strutture dati. Codici di Huffman

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni server

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

Oggetti Lezione 3. aspetti generali e definizione di classi I

Corso di Informatica (Basi di Dati)

Arduino: Programmazione

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Corso sul linguaggio SQL

Corso di Informatica

Lezione 4 Le code. Informatica. 26 Aprile Le pizze devono essere preparate e consegnate seguendo l ordine di arrivo degli ordini

Progetto: ARPA Fonte Dati. ARPA Fonte Dati. Regione Toscana. Manuale Amministratore

Programmazione a Oggetti Modulo B

Le stringhe. Le stringhe

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Esempio su strutture dati dinamiche: ArrayList

Progettazione : Design Pattern Creazionali

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

11/02/2015 MANUALE DI INSTALLAZIONE DELL APPLICAZIONE DESKTOP TELEMATICO VERSIONE 1.0

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Relazioni tra oggetti e classi : Composizione. Relazioni tra oggetti e classi : esempio di Aggregazione. classe contenitore

Tipi di Dato Ricorsivi

Linguaggio Java. Robusto. Orientato agli oggetti. Protegge e gestisce dagli errori. Non permette costrutti pericolosi

UML Diagrammi delle classi. UML Diagramma classi 1

Транскрипт:

Programmazione con Java ArrayList e Generics Daniela Micucci daniela.micucci@unimib.it ARRAYLIST Programmazione con Java ArrayList e Generics 2 1

La classe ArrayList Fa parte delle librerie standard di Java In generale, un ArrayList assolve lo stesso compito di un array, ad eccezione del fatto che un oggetto ArrayList può cambiare lunghezza mentre il programma è in esecuzione La classe ArrayList è implementata utilizzando un array come una variabile di istanza privata Quando l array è pieno, viene creato un nuovo array di dimensione più grande e vengono spostati al suo interno gli elementi Programmazione con Java ArrayList e Generics 3 La classe ArrayList Realizza una lista di elementi (oggetti) Gli elementi possono essere aggiunti: Alla fine All inizio Tra altri elementi È possibile editare, cancellare, accedere e contrare gli elementi all interni della lista Programmazione con Java ArrayList e Generics 4 2

Creare ArrayList Al fine di utilizzare la classe ArrayList, occorre importarla dal package java.util L utilizzo è lo stesso di una qualsiasi altra classe, ad eccezione del fatto che va specificato il tipo base come segue: ArrayList<TipoBase> objname = new ArrayList<TipoBase>(); In fase di instanziazione, il tipo base verrà sostituito da un tipo reference (o tipo classe) che specificherà il tipo di elementi che la lista conterrà import java.util.arraylist; public class Demo01 { //Capacità iniziale pari a 10 elementi ArrayList<String> lista = new ArrayList<String>(); Programmazione con Java ArrayList e Generics 5 Creare ArrayList Può essere specificata una capacità iniziale nel momento della creazione ArrayList<TipoBase> objname = new ArrayList<TipoBase>(cap); Anche se si specifica la capacità iniziale, la lista può crescere di dimensione dinamicamente import java.util.arraylist; public class Demo01 { //Capacità iniziale pari a 20 elementi ArrayList<String> lista = new ArrayList<String>(20); Programmazione con Java ArrayList e Generics 6 3

Usare metodi di ArrayList Per poter inserire/eliminare/manipolare elementi di una lista occorre utilizzare i metodi che ArrayList mette a disposizione A differenza degli array che permettono solo: Uso delle [] Variabile length Aggiungere elementi: In ultima posizione public boolean add(tipobase nuovoelemento) public void add(int index, TipoBase nuovoelemento) Modificare elementi: In posizione specificata da index. 0<= index <= indice dell ultimo elemento +1 In posizione specificata da index. 0<= index <= indice dell ultimo elemento public void set(int index, TipoBase nuovoelemento) Programmazione con Java ArrayList e Generics 7 Esempio 1 import java.util.arraylist; public class Demo03 { ArrayList<String> lista = new ArrayList<String>(); lista.add("mele"); lista.add("pere"); lista.add("uova"); lista.add(2, "Insalata"); System.out.println(lista); Output: [Mele, Pere, Insalata, Uova] Programmazione con Java ArrayList e Generics 8 4

Esempio 2 import java.util.arraylist; public class Demo03 { ArrayList<String> lista = new ArrayList<String>(); lista.add("mele"); lista.add("pere"); lista.add("uova"); lista.add(2, "Insalata"); System.out.println(lista); lista.set(0, "Albicocche"); System.out.println(lista); Output: [Mele, Pere, Insalata, Uova] [Albicocche, Pere, Insalata, Uova] Programmazione con Java ArrayList e Generics 9 Accedere in lettura e rimozione Accedere a singoli elementi: public TipoBase get(int index) ArrayList<String> lista = new ArrayList<String>(); lista.add("mele"); String elemento = lista.get(0); In posizione specificata da index. 0<= index <= indice dell ultimo elemento Rimuovere elementi: public TipoBase remove(int index) ArrayList<String> lista = new ArrayList<String>(); lista.add("mele"); String elemento = lista.remove(0); Programmazione con Java ArrayList e Generics 10 5

Numero elementi in un ArrayList Il metodo size è utilizzato per determinare il numero di elementi all interno dell ArrayList public int size() import java.util.arraylist; public class Demo03 { ArrayList<String> lista = new ArrayList<String>(); lista.add("mele"); lista.add("pere"); int numelem = lista.size(); System.out.println(numElem); Output: 2 Programmazione con Java ArrayList e Generics 11 Altri metodi Rimuovere tutti gli elementi public void clear() Verificare se la collezione è vuota public boolean isempty() Verificare se la collezione contiene un certo elemento public boolean contains(object elem) consultare la documentazione! http://docs.oracle.com/javase/ Programmazione con Java ArrayList e Generics 12 6

Metodo contains Si basa sull equals Esempio: Creare un ArrayList di String e un ArrayList di Persona Inserire rispettivamente la String «Ciao» e la Persona con nome Mario e età 21 Verificare se il primo array contiene la String «Ciao» e il secondo la Persona Mario con età 21 Codificare equals in Persona e riprovare Programmazione con Java ArrayList e Generics 13 Scorrere un ArrayList La classe ArrayList è un esempio di collection class (letteralmente classe collezione) Con la versione 5.0, Java ha aggiunto un nuovo tipo di loop chiamato for each o enhanced for Questo ciclo è stato progettato per ciclare tutti gli elementi di una collezione (come appunto un ArrayList) Sintassi: for (TipoBase_Array_List var : ArrayList_Obj) { //istruzioni Programmazione con Java ArrayList e Generics 14 7

Esempio for-each import java.util.arraylist; public class Demo03 { ArrayList<String> lista = new ArrayList<String>(); lista.add("mele"); lista.add("pere"); lista.add("uova"); lista.add(2, "Insalata"); for (String elemento : lista) { System.out.println(elemento); Output: Mele Pere Insalata Uova Programmazione con Java ArrayList e Generics 15 Esempi pratico: Insieme di stringhe Si implementi il concetto di insieme di stringhe che supporti le tipiche operazioni fra insiemi: Aggiunta di elementi Appartenenza di un elemento Unione e intersezione di un insieme rispetto ad un altro insieme, Calcolo della cardinalità Verifica se l insieme è vuoto Si realizzi un caso di test che crea l insieme {«mela», «pera», «banana» e l insieme {«papaia», «banana», «fragola» faccia l unione del primo con il secondo e verifichi che il primo insieme non è vuoto ha cardinalità 5 faccia l intersezione del primo con il secondo e verifichi che il primo insieme non è vuoto ha cardinalità 1 InsiemeDiStringhe - elementi :ArrayList<String> + InsiemeDiStringhe() + aggiungi(elemento :String) :void + appartiene(daverificare :String) :boolean + cardinalita() :int + vuoto() :boolean + uniscicon(altroinsieme :InsiemeDiStringhe) :void + intersecacon(altroinsieme :InsiemeDiStringhe) :void TestCase InsiemeDiStringheTest + testunione() :void + testintersezione() :void Programmazione con Java ArrayList e Generics 16 8

Esercizio pratico: todo list «interface» ToDoList + inserisciattivita(attivita) : void + rimuoviattivita(attivita) : void + sostituisciattivita(attivita, Attivita) : void + svuotalista() : voi d + duratacomplessivaattivita() : int + duratacomplessivaattivitasvolte() : int + duratacomplessivaattivitadasvolgere() : int + svolgiattivita() : void Versione array e versione ArrayList per l associazione con Attivita TestCase TestToDoListArrayList + testsostituzione() : void + testrimozione() : void + testsvolgimento() : void ToDoListArray - lista: Attivita ([]) + ToDoListArray() + inserisciattivita(attivita) : void + rimuoviattivita(attivita) : void + sostituisciattivita(attivita, Attivita) : void + svuotali sta() : void + duratacomplessivaattivita() : int + duratacomplessivaattivitasvolte() : int + duratacomplessivaattivitadasvolgere() : int + svolgiattivita() : void + tostring() : String ToDoListArrayList - lista: ArrayList<Attivita> + ToDoListArrayList() + inserisciattivita(attivita) : void + rimuoviattivita(attivita) : void + sostituisciattivita(attivita, Attivita) : void + svuotalista() : void + duratacomplessivaattivita() : int + duratacomplessivaattivitasvolte() : int + duratacomplessivaattivitadasvolgere() : int + svolgiattivita() : void + tostring() : String Attiv ita - descrizione: String - duratainminuti: int - svolta: boolean -lista -lista + Attivita(String, int) * + getdescrizione() : String * + getduratainminuti() : int + issvolta() : boolean + svolta() : void Programmazione con Java ArrayList e Generics + tostring() : String 17 + equals(object) : boolean GENERICS Programmazione con Java ArrayList e Generics 18 9

Classi parametriche e Generici La classe ArrayList è una classe parametrica Ha un parametro, denominato tipo base che può essere sostituito da un qualsiasi tipo reference (tipo classe) A partire dalla versione 5.0 (Tiger), Java permette di definire classi con tipi parametrici Queste classi sono chiamate classi parametriche o definizioni generiche o generici Programmazione con Java ArrayList e Generics 19 Classi parametriche e Generici La classe ArrayList è una classe parametrica Ha un parametro, denominato tipo base che può essere sostituito da un qualsiasi tipo reference (tipo classe) A partire dalla versione 5.0 (Tiger), Java permette di definire classi con tipi parametrici Queste classi sono chiamate classi parametriche o definizioni generiche o generici Esiste anche la versione non parametrica della classe ArrayList Che tipo di oggetti specifica di contenere? Come manipolo i tipi specifici? Programmazione con Java ArrayList e Generics 20 10

Perché i generici? Si supponga di voler definire una classe che modella una scatola in grado di contenere un oggetto che a priori non si sa cosa sia Con le conoscenze attuali: public class ScatolaVersione1 { private Object oggetto; public void inserisci(object oggetto) { this.oggetto = oggetto; public Object rimuovi(){ Object tmp = oggetto; oggetto = null; return tmp; Programmazione con Java ArrayList e Generics 21 Perché i generici? Come recuperare un oggetto inserito nella scatola per poterlo manipolare correttamente? public class DemoScatolaVersione1 { ScatolaVersione1 scatola1 = new ScatolaVersione1(); scatola1.inserisci(new Libro("Programmazione", 600)); Object elemento = scatola1.rimuovi(); if(elemento instanceof Libro){ Libro libro = (Libro)elemento; System.out.println(libro.getNumeroPagine()); Object wow! Libro CDAudio - titolo: String - autore: String - numeropagine: int - titolo: String - numerotracce: int + Libro(titolo :String, numeropagine :int) + gettitolo() : String + CDAudio(autore :String, titolo :String, numerotracce :int) + getnumeropagine() : int + setautore(autore :String) : void + settitolo(titolo :String) : void + setnumerotracce(numerotracce :int) : void Programmazione con Java ArrayList e Generics 22 11

Generici Classi e metodi possono specificare un tipo parametrico invece di un tipo ben specifico (classe o primitivo) Il tipo parametrico può essere sostituito con qualsiasi tipo classe Tradizionalmente viene utilizzata una singola lettera maiuscola per specificare il tipo parametrico In realtà è possibile utilizzare qualsiasi identificativo diverso dalle keyword del linguaggio Programmazione con Java ArrayList e Generics 23 Generici Una definizione di classe con tipo parametro è memorizzata in un file e compilato come qualsiasi altra classe Una volta compilata, la classe può essere usata come qualsiasi altra classe La differenza sta solo nel fatto che va specificato il tipo classe prima di poter usare la classe parametrica Ciò lo si fa istanziando la classe generica: ClasseParametrica<TipoClasseScelta> objname = new ClasseParametrica<TipoClasseScelta>(); Esempio: ArrayList<String> objname = new ArrayList<String>(); Programmazione con Java ArrayList e Generics 24 12

Definire una classe parametrica La classe Scatola rivista public class ScatolaVersione2 <T> { private T oggetto; public void inserisci(t elemento){ this.oggetto = elemento; public T rimuovi(){ T tmp = oggetto; oggetto = null; return tmp; 1. Il tipo parametrico è specificato all interno di <> 2. Va specificato subito dopo il nome della classe 3. Può essere utilizzato un identificativo a piacere (ad esclusione delle keyword) 1. Il tipo parametrico è utilizzato all interno della classe come un qualsiasi altro tipo (primitivo o classe) T ScatolaVersione2 - oggetto: T + ScatolaVersione2(elemento :T) + ScatolaVersione2() + inserisci(elemento :T) : void + rimuovi() : T Programmazione con Java ArrayList e Generics 25 Usare una classe parametrica public class DemoScatolaVersione2 { ScatolaVersione1 scatola1 = new ScatolaVersione1(); scatola1.inserisci(new Libro("Programmazione", 600)); Object elemento = scatola1.rimuovi(); if(elemento instanceof Libro){ Libro libro = (Libro)elemento; System.out.println(libro.getNumeroPagine()); //Con i Generics ScatolaVersione2<Libro> scatola2 = new ScatolaVersione2<Libro>(); scatola2.inserisci(new Libro("Programmazione", 600)); Libro libro = scatola2.rimuovi(); System.out.println(libro.getNumeroPagine()); Programmazione con Java ArrayList e Generics 26 13

Classe parametrica con costruttori public class ScatolaVersione2 <T> { private T oggetto; public ScatolaVersione2(T elemento){ inserisci(elemento); public ScatolaVersione2(){ this(null); public void inserisci(t elemento){ this.oggetto = elemento; public T rimuovi(){ T tmp = oggetto; oggetto = null; return tmp; Programmazione con Java ArrayList e Generics 27 Convenzioni di naming I nomi per itipi parametrici più usati sono: E Element Usato in maniera estensiva dal Java Collection Framework K Key N Number T Type V Value S,U,V etc. 2nd, 3rd, 4th types Programmazione con Java ArrayList e Generics 28 14

Pitfall #1 Il costruttore di una classe parametrica non viene specificato mediante <> public ScatolaVersione2(T elemento) public ScatolaVersione2() public ScatolaVersione2<T>(T elemento) public ScatolaVersione2<T>() Ok! Ko! anche se quando si istanzia una classe parametrica si usano le <> Libro libro = new Libro( Programmazione", 600); ScatolaVersione2<Libro> scatola1 = new ScatolaVersione2<Libro>(libro); ScatolaVersione2<Libro> scatola2 = new ScatolaVersione2<Libro>(); Programmazione con Java ArrayList e Generics 29 Pitfall #2 Il tipo base non può essere sostituito con un tipo primitivo Però Java mette a disposizione per ogni tipo primitivo la classe corrispondente (chiamata wrapper) Un wrapper di tipo primitivo è un oggetto che incapsula un attributo di tipo primitivo: Mantiene il comportamento del tipo primitivo Permette di usarlo come un oggetto Tipo primitivo boolean char byte short int long float double Classe Boolean Char Byte Short Integer Long Float Double Programmazione con Java ArrayList e Generics 30 15

Classi wrapper: Boxing Il processo di conversione da tipo primitivo ad oggetto della corrispondente classe wrapper Si può pensare come ad una «scatola» in cui viene inserito un valore di tipo primitivo (boxing = inscatolamento) Fatto in maniera automatica da Java Integer n = new Integer(42); Double d = new Double(9.99); Character c = new Character( z ); Integer n = 42; Double d = 9.99; Character c = z ; Programmazione con Java ArrayList e Generics 31 Classi wrapper: Unboxing Il processo di conversione inverso da oggetto a corrispondente tipo primitivo Fatto in maniera automatica da Java Esistono dei metodi opportuni Integer n = new Integer(42); int i = n; int a = new Integer(42); double d = new Double(9.99); char c = new Character( z ); Programmazione con Java ArrayList e Generics 32 16

Pitfall #2: esempio public class DemoScatolaVersione3 { ScatolaVersione2<Integer> scatola = new ScatolaVersione2<Integer>(); scatola.inserisci(new Integer(4)); Integer i = scatola.rimuovi(); //inboxing aoutomatico scatola.inserisci(4); //outboxing aoutomatic int x = scatola.rimuovi(); Programmazione con Java ArrayList e Generics 33 Pitfall #3 A differenza di un tipo classe che può essere utilizzato sempre all interno di una definizione di classe, il tipo parametrico ha alcune limitazioni In particolare, non può essere utilizzato con la new, i.e., per creare oggetti T object = new T(); T[] a = new T[10]; Programmazione con Java ArrayList e Generics 34 17

Pitfall #4 Array definiti come segue sono illegali: ScatolaVersione2<String>[] a = new ScatolaVersione2<String>[10]; Anche se sembra ragionevole, ciò non è permesso dal modo con cui Java realizza i generici Programmazione con Java ArrayList e Generics 35 Più tipi parametrici Una definizione di classe può avere un qualsiasi numero di tipi parametrici I parametri sono elencati in parentesi angolari come unico tipo parametrico, ma sono separati da una virgola T E CoppiaAssortita - primo: T - secondo: E + CoppiaAssortita(primo :T, secondo :E) + setprimo(primo :T) : void + setsecondo(secondo :E) : void + getprimo() : T + getsecondo() : E public class CoppiaAssortita<T, E> { private T primo; private E secondo; public CoppiaAssortita(T primo, E secondo){ this.primo = primo; this.secondo = secondo; public void setprimo(t primo){ this.primo = primo; public void setsecondo(e secondo){ this.secondo = secondo; public T getprimo(){ return primo; public E getsecondo(){ return secondo; Programmazione con Java ArrayList e Generics 36 18

Utilizzo di una classe con più tipi parametrici public class DemoCoppiaAssortita { CoppiaAssortita<Libro, Integer> ca1 = new CoppiaAssortita<Libro, Integer> (new Libro("I pilastri della terra", 1000), 9); Libro l = ca1.getprimo(); int score = ca1.getsecondo(); System.out.println("Il libro " + l.gettitolo() + " ha uno score pari a " + score); Output: Il libro I pilastri della terra ha uno score pari a 9 Programmazione con Java ArrayList e Generics 37 Pitfall #5 Non è permesso definire classi generiche che specializzano Throwable o classi discendenti Eg. Exception, Error Ad esempio: public class ProvaEccezione <T> extends Exception genererà un errore in compilazione Programmazione con Java ArrayList e Generics 38 19

Limitare i tipi parametrici A volte risulta utile limitare (bound) i tipi che possono essere utilizzati per attualizzare un tipo parametrico T Ad esempio, per assicurare che i tipi classe che possono essere utilizzati siano di tipo VeicoloMotorizzato public class Silos <T extends VeicoloMotorizzato> { //... public class DemoSilos { Silos<Auto> silos1 = new Silos<Auto>(); Silos<Camper> silos2 = new Silos<Camper>(); «interface» VeicoloMotorizzato + accendi() : void + spegni() : void + frena() : void + accelera() : void T:extends VeicoloMotorizzato Silos + entrata(t) : void Camper + accendi() : void + spegni() : void + frena() : void + accelera() : void Auto + accendi() : void + spegni() : void + frena() : void + accelera() : void Programmazione con Java ArrayList e Generics 39 Limitare i tipi parametrici Ogni tentativo di inserire un tipo che non specializza la classe VeicoloMotorizzato risulterà in un errore in compilazione: Silos<Libro> silos1 = new Silos<Libro>(); Un bound su un tipo può essere specificato mediante un nome di classe (o di interfaccia) Solo le classi discendenti di quella bounding possono essere specificate come tipo Programmazione con Java ArrayList e Generics 40 20

Limitare i tipi parametrici Una espressione di bounding può contenere una o più interfacce, ma solo una classe La sintassi è la seguente public class ProvaSimple <T extends ClassC & InterfaceA & InterfaceB> Se c è più di un tipo parametrico public class ProvaSimple <T extends ClassC & InterfaceA & InterfaceB, E extends ClassD> Programmazione con Java ArrayList e Generics 41 Interface generiche Una interface può avere uno o più tipi parametrici I dettagli e le notazioni sono analoghe a quelle viste per le classi Programmazione con Java ArrayList e Generics 42 21

Ereditarietà con i generici Una classe generica può essere definita come derivata di Una classe ordinaria Un altra classe generica Date due classi Auto e CityCar e una classe generica Silos, non sussiste alcuna relazione tra Silos<Auto> e Silos<CityCar> anche se CityCar è una specializzazione di Auto Programmazione con Java ArrayList e Generics 43 Ultima nota Una volta specificato il tipo classe, è possibile utilizzare oggetti istanziati a partire da quella classe e sottoclasse «interface» VeicoloMotorizzato + accendi() : void + spegni() : void + frena() : void + accelera() : void T:extends VeicoloMotorizzato Silos + entrata(t) : void Camper + accendi() : void + spegni() : void + frena() : void + accelera() : void Auto + accendi() : void + spegni() : void + frena() : void + accelera() : void CityCar public class DemoSilos { Silos<VeicoloMotorizzato> silos3 = new Silos<VeicoloMotorizzato>(); silos3.entrata(new Auto()); silos3.entrata(new CityCar()); silos3.entrata(new Camper()); Programmazione con Java ArrayList e Generics 44 22

Sempre inerente all ultima nota Attenzione però a import java.util.arraylist; import java.util.list; public class Prova { //Vale tutto il principio dei tipi e sottotipi //List è una superclasse di ArrayList List<Number> numbers = new ArrayList<Number>(); //2 è un Integer che è una sottolcasse di Number numbers.add(2); //Integer //3.14d è un Double che è una sottolcasse di Number numbers.add(3.14d); //Double /*ATTENZIONE pero' che * che ArrayList<Integer> NON E' UN SOTTOTIPO di ArrayList<Number> * (e tanto meno List<Integer> di ArrayList<Number>) * in quanto viene violato il principio di sostituzione come * si evince dal seguente esempio:*/ //ArrayList<Number> integers = new ArrayList<Integer>(); //NON COMPILA List<Integer> interi = new ArrayList<Integer>(); interi.add(2); List<Number> numeri = interi; // non compila! numeri.add(3.14d); Programmazione con Java ArrayList e Generics 45 Esercizio lista concatenata Attiv ita - descrizione: String - duratainminuti: int - svolta: boolean + Attivita(descrizione :String, duratainminuti :int) + getdescrizione() : String + getduratainminuti() : int + issvolta() : boolean + svolta() : void + tostring() : String + equals(altraattivita :Object) : boolean E Nodo - dato: E - next: Nodo<E> + Nodo(dato :E, next :Nodo<E>) + getdato() : E + setdato(dato :E) : void + getnext() : Nodo<E> + setnext(next :Nodo<E>) : void + tostring() : String -head 1 concretizza dato in Nodo E DemoLista + main(args :String[]) : void ListaConcatenata + ListaConcatenata() + aggiunginodo(nodo :Nodo<E>) : void + aggiunginodo(elemento :E) : void + tostring() : String Programmazione con Java ArrayList e Generics 46 23

Esercizio conclusivo (1/2) TestCase Test + testcentrale() : void + testcentraleequa1() : void + testcentraleequasoloprioritarie() : void Persona - nome: String - indirizzo: String - citta: String + Persona(nome :String, indirizzo :String, citta :String) + getnome() : String + getindirizzo() : String + getcitta() : String + tostring() : String -destinatario -mittente CentraleSmistaPosta - filiale: String + CentraleSmistaPosta(filiale :String) + ricevilettera(nuovalettera :Lettera) : void # posizioneletteradasmistare() : int # getlettera(posizione :int) : Lettera + smistalettera() : Lettera + tostring() : String Lettera + PRIORITARIA: int = 1 {readonly + TRADIZIONALE: int = 0 {readonly - tipospedizione: int #lettere * + Lettera(mittente :Persona, destinatario :Persona, tipospedizione :int) + Lettera(mittente :Persona, destinatario :Persona) + getmittente() : Persona + getdestinatario() : Persona + gettipospedizione() : int + tostring() : String CentraleSmistaPostaEqua - numeroprioritariesmistate: int + NUMERO_MAX_PRIORITARIE_CONSECUTIVE: int = 2 + CentraleSmistaPostaEqua(filiale :String) # posizioneletteradasmistare() : int Exception DestinatarioNonSpecificatoException + DestinatarioNonSpecificatoException() Programmazione con Java ArrayList e Generics 47 Esercizio conclusivo (2/2) Entrambi i costruttori di Lettera lanciano eccezione se il mittente è null Il costruttore di Lettera public Lettera(Persona mittente, Persona destinatario), imposta il tipo di spedizione a tradizionale L associazione tra Lettera e CentraleSmistaPosta va realizzata con un ArrayList Metodi di CentraleSmistaPosta: public void ricevilettera(lettera nuovalettera) accoda la nuova lettera protected int posizioneletteradasmistare(): restituisce la prima prioritaria se c è o la prima tradizionale protected Lettera getlettera(int posizione): restituisce la lettera alla posizione specificata senza rimuoverla dalla lista public Lettera smistalettera(): rimuove e restituisce la prima lettera prioritaria che trova. In caso di lettere solo tradizionali, rimuove la prima Metodi CentraleSmistaPostaEqua L attributo numeroprioritariesmistate mantiene il numero di prioritarie attualmente smistate protected int posizioneletteradasmistare(): ogni NUMERO_MAX_PRIORITARIE_CONSECUTIVE lettere prioritarie smistate, restituisce la posizione della prima tradizionale. Se non esistono lettere prioritarie, restituisce la posizione della prima tradizionale. Se non ha ancora smistato NUMERO_MAX_PRIORITARIE_CONSECUTIVE lettere prioritarie, restituisce la prima prioritaria Programmazione con Java ArrayList e Generics 48 24

Digressione: wildcard Le classi e le interfacce possono specificare tipi parametrici che non sono completamente definiti Poiché specificano un ampio insieme di tipi, sono conosciuti come wildcard, i.e., caratteri generali public void metodo(string arg1, ArrayList<?> arg2) È una stringa È un ArrayList il cui tipo base può essere di qualsiasi tipo Programmazione con Java: Collection Framework 49 Digressione: wildcard Può essere messo un bound sul wildcard in modo da specificare che il tipo deve essere un tipo antenato tipo o un tipo discendente di qualche tipo classe o interfaccia La notazione <? extends Elemento> specifica che il tipo sostituito deve essere un discendente della classe Elemento La notazione <? super Elemento> specifica che il tipo sostituito deve essere un antenato della classe Elemento Programmazione con Java: Collection Framework 50 25