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