Prato via Pomeria,90. Java & Generics. Alcune novità introdotte a partire dalla versione 5.0. Flavio Casadei Della Chiesa
|
|
- Maddalena Alessi
- 5 anni fa
- Visualizzazioni
Transcript
1 Prato via Pomeria,90 Java & Generics Alcune novità introdotte a partire dalla versione 5.0 Flavio Casadei Della Chiesa fcasadei@gmail.com 1
2 Obiettivi Presentare i generics a programmatori old-fashion Elencare le funzionalità di base dei generics Studiare le trappole dei generics Non verranno fornite spiegazioni o motivazioni sul perché classi e metodi generici siano migliori o peggiori della controparte legacy 2
3 Argomenti trattati 1)Alcune novità rispetto a java 1.4 2)Subtiping & Wildcards 3)Confronti tra elementi 4)Dichiarazioni di classi generiche 5)Evoluzione, non rivoluzione 6)Reifcation 3
4 Riferimenti... Java Generics and Collections O'Reilly Java Language Specification - SUN 4
5 Cominciamo Generics e Collections vanno a braccetto con altre nuove feature (introdotte da Java5): boxing e unboxing; nuovo ciclo for; funzioni che accettano un numero variabile di argomenti. La loro combinazione è sinergica: l'intero è maggiore della somma delle parti! 5
6 Un primo esempio 1/ List<Integer> ints = Arrays.asList(1,2,3); int s = 0; for (int n : ints) { s += n; } assert s == 6; Probabilmente il codice è comprensibile anche senza alcuna spiegazione... 6
7 Un primo esempio 2/ List ed ArrayList sono parte del CollectionFramework. List è generico: è possibile scrivere List<E> per indicare liste contenenti elementi di tipo E. List<Integer> indica liste contenenti elementi di tipo Integer. List<Integer> ints = Arrays.asList(1,2,3); int s = 0; for (int n : ints) { } s += n; assert s == 6; 7
8 Un primo esempio 3/ boxing ed unboxing automagicamente applicati List<Integer> ints = Arrays.asList(1,2,3); int s = 0; for (int n : ints) { s += n; } assert s == 6; 8
9 Un primo esempio 4/ Il metodo statico Arrays.asList prende un numero variabile di argomenti. List<Integer> ints = Arrays.asList(1,2,3); int s = 0; for (int n : ints) { } s += n; assert s == 6; 9
10 Un primo esempio 5/ Ciclo foreach: permette di associare ad una variabile i valori contenuti in un oggetto iterabile Ad ogni iterazione si prende l'elemento successivo List<Integer> ints = Arrays.asList(1,2,3); int s = 0; for (int n : ints) { } s += n; assert s == 6; 10
11 Un primo esempio 6/ Lo statement assert permette di controllare che l'asserzione fatta sia corretta Asserzione vera AssertionError disabilitate di default... List<Integer> ints = Arrays.asList(1,2,3); int s = 0; for (int n : ints) { } s += n; assert s == 6; 11
12 Un primo esempio 7/ (codice old fashion) List ints = Arrays.asList(new Integer [] { new Integer(1), new Integer(2), new Integer(3) } ); int s = 0 ; for (Iterator it = ints.iterator() ; it.hasnext() ; ){ int n = ((Integer)it.next()).intValue(); s += n; } assert(s == 6); 12
13 Un primo esempio 8/ Il precedente codice è meno leggibile del primo :-( Senza i generics non è possibile indicare che tipo di elementi vogliamo inserire nella lista sono necessari dei cast :-( Senza boxing ed unboxing è necessario eseguire manualmente la conversione esempio:.intvalue() 77
14 Un primo esempio 9/ Senza funzioni ad argomenti variabili è necessario passare alla aslist un array preimpostato :-( Senza il ciclo foreach è necessario istanziare un iteratore per scandire la lista :-( Si c'è anche un altro modo. 14
15 Pausa Domande? Osservazioni? 15
16 Generics: base 1/ Una classe o interfaccia può dichiarare di ricevere uno o più parametri di tipo: Sono scritti tra parentesi angolate (<T>) I tipi attuali devono essere forniti quando si dichiara una variabile quando si istanzia un oggetto 16
17 Generics: base 2/ List <String> words = new ArrayList<String>(); words.add("hello "); words.add("world!"); String s = words.get(0) + words.get(1); assert s.equals("hello world!"); 17
18 Generics: base 3/ List<String> words = new ArrayList<String>(); words.add("hello "); words.add("world!"); String s = words.get(0) + words.get(1); assert s.equals( "Hello world!"); La classe ArrayList<E> implementa l'interfaccia List<E> words è una lista contenente stringhe Vengono inserite due stringhe e successivamente vengono recuperate... tutto senza cast! 18
19 Generics: base 4/ Codice senza l'ausilio dei generics... List words = new ArrayList(); words.add("hello "); words.add("world!"); String s = (String)words.get(0) + (String)words.get(1); assert s.equals("hello world!"); 19
20 Type Erasure 1/ Il bytecode compilato dei due precedenti esempi è (grossomodo) identico retro compatibilità I generics sono implementati tramite la type erasure 20
21 Type Erasure 2/ Compile time List<integer> List<String> List<List<String>> Run Time List List List I generics eseguono implicitamente il cast che deve essere esplicitato nella versione senza generics 21
22 Type Erasure 3/ Cast-iron guarantee: I cast impliciti aggiunti dalla compilazione dei generics non falliscono mai!(*) (*) si applica esclusivamente al caso in cui non vengano inviati dal compilatore dei unchecked warnings 22
23 Type Erasure come mai? Semplicità il bytecode è identico Dimensioni c'è solo una classe List Evoluzione il bytecode (*) è retro compatibile e le librerie con e senza generics possono coesistere E' possibile evolvere il proprio codice con calma e con pazienza (*) Solo se ricompilato per versioni vecchie di java 23
24 Generics VS Template C++ Java Generics C++ Template List<List<String>> List< List<String> > (con lo spazio!) :-( Type erasure: una sola versione della classe Expansion: n versioni della solita classe; una per ogni tipo definito a compile-time code bloat :-( (?ottimizzazioni?) 24
25 Tipi reference Classi Istanze Array (tutti) Possono assumere il valore null Sono tutti fgli di Object 25
26 Tipi primitivi 8 tipi primitivi hanno un corrispondente tipo reference nel package java.lang Primitivo byte short int long float double bool char Reference Byte Short Integer Long Float Double Boolean Character 26
27 Boxing e unboxing Boxing conversione da primitivo a reference Unboxing conversione da reference a primitivo La conversione viene fatta in automatico int e new Integer(e) // boxing Integer e e.intvalue() // unboxing 27
28 Esempi boxing/unboxing // OK public static int somma(list<integer> ints){ int s = 0; for ( int n :ints) { s += n ; } return s; } //Troppe conversioni! Performance :-( public static Integer sommainteger(list<integer> ints) { Integer s = 0; for ( int n :ints) { s += n ; } return s; } 28
29 Binary Numeric Promotion Se uno degli operandi è un reference type viene applicato l'unboxing Poi Se uno degli operandi è double anche l'altro viene promosso a double Se uno degli operandi è foat anche l'altro viene promosso a foat Se uno degli operandi è long anche l'altro viene promosso a long Altrimenti entrambi vengono promossi a int Si applica a vari operatori binari (tra cui ==) 29
30 Pericolo boxing/unboxing == 1/ Per i primitivi == signifca uguaglianza dei valori Per i reference == signifca stessa identità List<Integer> bigs = Arrays.asList(100,200,300); assert sommainteger(bigs) == somma(bigs); assert sommainteger(bigs)!= sommainteger(bigs); // non raccomandato I generics funzionano solo con i reference 30
31 Pericolo boxing/unboxing == 2/ Interi da -128 a 127, caratteri da 0 a \u007f, Byte e Boolean possono essere cachati List<Integer> smalls = Arrays.asList(1,2,3); assert sommainteger(smalls) == somma(smalls);// 6 assert sommainteger(smalls) == sommainteger(smalls); // 6, non raccomandato 31
32 Pericolo boxing/unboxing == 3/ Posso assegnare null ad un primitivo? NO 32
33 Due paroline sul ciclo foreach For (Pippo p: pippi) Applicabile a istanze di java.lang.iterable<t> Applicabile ad array[] Esegue in automatico eventuali boxing ed unboxing int[] ints = {1,2,3,4}; for (Integer i :ints) System.out.println(i); 33
34 Pausa Domande? Osservazioni? 34
35 Metodi Generici 1/ class Lists { public static <T> List<T> tolist(t[] arr){ List<T> list = new ArrayList<T>(); for (T elem: arr) list.add(elem); return list; }... 35
36 Metodi Generici 2/ class Lists { public static <T> List<T> tolist(t[] arr){ List<T> list = new ArrayList<T>(); for (T elem: arr) list.add(elem); return list; }... Il metodo tolist accetta un array di tipo T[] e ritorna un List<T> per ogni tipo T Si deve indicare <T> all'inizio della frma del metodo statico T è un parametro di tipo Ogni metodo che dichiara un parametro di tipo è un metodo generico 36
37 Metodi Generici 3/ List<Integer> ints = Lists.toList( new Integer[] {1,2,3}); List<String> strings = Lists.toList( new String[] {"ciao","mondo"}); Boxing e unboxing gratuiti! 37
38 Varargs 1/ Che noia inserire gli elementi nell'array! public static <T> List<T> tolist(t... arr){ List<T> list = new ArrayList<T>(); for (T elem: arr) list.add(elem); return list; }... List<Integer> ints = Lists.toList( 1,2,2); List<String> strings = Lists.toList( "ciao","mondo"); 38
39 Varargs 2/ Abbiamo sostituito T[] con T L'array[] con valori separati da virgola Qualsiasi numero di argomenti può precedere il vararg niente deve seguire il vararg 39
40 Varargs 3/ Attenzione! Il tipo T non viene sempre dedotto dal compilatore, a volte è necessario esplicitarlo Lists.<Object> <Object>toList( 1,"mondo"); Non è detto che Integer e String abbiano in comune solo Object! (Serializable, Comprarable, ) 40
41 Asserzioni Possono essere abilitate tramite i fag della JVM -ea o -enableassertions Altrimenti stanno a dormire... 41
42 Parte II Subtyping & Wildcards 42
43 Subtyping (alcune nozioni) In Java un tipo A è un sottotipo di un altro tipo B se questi sono legati da una clausola extends o implements A extends B o A implements B (Integer è sottotipo di Number, List<E> è sottotipo di Collection<E>) 43
44 Subtyping (alcune nozioni) Subtyping è rifessiva e transitiva Se A è sottotipo di B allora B è supertipo di A Ogni tipo reference è sottotipo di Object ed Object è supertipo di ogni reference type 44
45 Principio di sostituzione I) Ad una variabile di un certo tipo T può essere assegnato un valore di qualsiasi sottotipo del tipo T II) Un metodo che ha un parametro di tipo T può essere invocato con un argomento il cui tipo è un sottotipo di T 45
46 Principio di sostituzione 1/ interface Collection<E>{... public boolean add(e elem);... } Principio di sostituzione: possiamo aggiungere Integer e Double a collezioni di Numbers (Integer e Double sono sottotipi di Number) 46
47 Principio di sostituzione 2/ List<Number> numeri = new ArrayList<Number>(); numeri.add(2); OK List<Number> è sottotipo di Collection<Number> OK 2 ha tipo* Integer che è sottotipo di Number numeri.add(3.14); assert numeri.tostring().equals( OK 3.14 ha tipo* Double che è sottotipo di Number Per ora tutto OK "[2, 3.14]"); 47
48 Eccoci al dunque... 48
49 Wildcards con extends 1/ interface Collection<E>{... public boolean addall( Collection<? extends E> c);... } OK, posso inserire in una collezione di tipo E elementi di tipo E? extends E OK, posso inserire in una collezione di tipo E elementi appartenenti ad una collezione di qualsiasi sottotipo di E 49
50 Wildcards con extends 2/ List<Number> numeri = new ArrayList<Number>(); List<Integer> interi = Arrays.asList(1,2); List<Double> doubles = Arrays.asList(2.78,3.14); OK Integer e Double sono sottotipi di Number List<Integer> è sottotipo di List<? extends Number> (idem per Double) numeri.addall(interi); numeri.addall(doubles); 50
51 Wildcards con extends 3/ List<Integer> interi = Arrays.asList(1,2); List<? extends Number> numeri = interi; numeri.add(3.14); Errore di compilazione List<? extends Number> può essere una lista di qualsiasi tipo di numero! Non è detto che sia una lista di Double! :-( assert interi.tostring().equals( "[1, 2, 3.14]"); 51
52 Wildcards con super 1/ public static <T> void copia(list<? super T> dest, List<? extends T> src){ for (int i=0; i < src.size(); i++) {? super T lista destinazione di supertipo di T Attenzione dest.set.set(i,src.get(i)); } } 52
53 Wildcards con super 2/ List<Object> oggetti = Arrays.<Object>asList(2,3.14,"four"); List<Integer> interi = Arrays.asList(5,6); Collections.copia(oggetti, interi); assert oggetti.tostring().equals("[5, 6, four]"); 53
54 Get and Put Principle GET: Utilizzare il wildcard extends quando si deve solamente recuperare valori da una struttura PUT: Utilizzare il wildcard super quando si deve solamente inserire dati in una struttura GET and PUT: Non utilizzare i wildcard quando si deve sia prendere che inserire 54
55 Eccezioni al Get/Put principle? extends E è possibile inserire null? super T è possibile prelevare Object 55
56 Sporco trucco di programmazione public void rebox( Box<? extends Object> box) { Viene efettuata una chiamata ad un helper senza wildcard reboxhelper(box); } private static <V> void reboxhelper(box<v> box) { } box.put(box.get()); 56
57 Pausa Domande? Osservazioni? 57
58 Array 1/ Il subtyping degli array in java è covariante: S sottotipo di T S[] sottotipo di T[] Il codice sulla destra viene compilato Integer[] interi = new Integer[] {1,2,3}; Number[] numeri = interi; numeri[2] = 3.14; 58
59 Array 2/ Integer[] interi = new Integer[] {1,2,3}; Number[] numeri = interi; Numeri[2] = 3.14; Oops Exception in thread "main" java.lang.arraystoreexception: java.lang.double // numeri-->
60 Array 3/ List<Integer> interi= Arrays.asList(1,2,3); List<Number> numeri = interi; non compila! numeri.add(3.14); Subtyping per i generics è controvariante: S supertipo di T List<S> è sottotipo di List <? super T> 60
61 Covariante T T[] S S[] Object Object[] String String[] 61
62 Controvariante T List <? super S> S List<T> Object List<? super String> String List<Object> 62
63 Cattura del wildcard 1/ Quando viene invocato un metodo generico il parametro di tipo deve essere scelto in modo da combaciare con il tipo rappresentato dal wildcard wildcard capture 63
64 Cattura del wildcard 2/ public static <T> void reverse(list<t> list) <?> è un sinonimo di? extends Object public static void reverse(list<?> list) 64
65 Cattura del wildcard 3/ public static <T> void reverse(list<t> list){ List<T> tmp = new ArrayList<T>(list); for (int i = 0 ; i < list.size() ; i+ +){ list.set(i, tmp.get(list.size() -i - 1) ); } } public static void reverse(list<?> list){ List<Object> tmp = new ArrayList<Object>(list); for (int i = 0 ; i < list.size() ; i++){ list.set(i, tmp.get(list.size() -i - 1) ); } } 65
66 Cattura del wildcard 3/ public static <T> void reverse(list<t> list){ List<T> tmp = new ArrayList<T>(list); for (int i = 0 ; i < list.size() ; i+ +){ list.set(i, tmp.get(list.size() -i - 1) ); } } public static void reverse(list<?> list){ List<Object> tmp = new ArrayList<Object>(list); for (int i = 0 ; i < list.size() ; i++){ list.set(i, tmp.get(list.size() -i - 1) ); } } --- ERRORE DI COMPILAZIONE --- The method set(int, capture#3-of?) in the type List<capture#3-of?> is not applicable for the arguments (int, Object) 66
67 Restrizioni dei wildcard 1/ Creazione dell'istanza Chiamata a metodo generico Supertipo 67
68 Restrizioni dei wildcard: creazione List<?> l = new ArrayList<?>(); NO! Errore di compilazione List<? super Number > s = new ArrayList<Number>(); OK 68
69 Restrizioni dei wildcard: public class Lista { chiamata e metodi generici public static <T> List<T>factory() { return new ArrayList<T>(); } }.. OK List<?> l = Lista.factory(); OK List<?> l2 = Lista.<Object>factory(); OK List<?> l3 = Lista.<?>factory(); ERRORE List<?> l4 = Lista.<List<?>>factory(); OK 69
70 Restrizioni dei wildcard: supertipi Class Lista extends ArrayList<?> { } NO Class Lista2 implements List<?> { } NO Class List3 implements ArrayList<List<?>> { } OK 70
71 Parte III Confronti tra elementi (e limiti sui tipi) 71
72 Confronti Parleremo di Comparable<T> Confrontare elementi Trovare massimo e minimo in una collezione Metodi bridge 72
73 Comparable public interface Comparable<T> { public int compareto(t elem); } Restituisce un valore che è negativo, zero o positivo a seconda che il parametro fornito sia rispettivamente minore, uguale o maggiore del parametro implicito (this) Quando una classe implementa Comparable l'ordine specifcato dalla sua interfaccia è chiamato ordine naturale per la classe 73
74 Mele con mele... Integer i0 = 0; Integer i1 = 1; assert i0.compareto(i1) < 0; String s0 = "zero"; (Di norma) un oggetto di una classe può essere confrontato solo con oggetti della stessa classe (pere con pere, mele con mele) String s1 = "uno"; assert s0.compareto(s1) > 0; 74
75 ma non mele con pere Number n1 = 1; Number npi = 3.14; Posso confrontare mele con pere? assert n1.compareto(npi) <0; 75
76 ma non mele con pere Number n1 = 1; Number npi = 3.14; assert n1.compareto(npi) <0; Posso confrontare mele con pere? NO errore di compilazione 76
77 ma non mele con pere Number n1 = 1; Number npi = 3.14; assert n1.compareto(npi) <0; Notare il boxing Il codice non compila! Number non implementa Comparable 77
78 Consistente con l'uguaglianza x.equals(y) x.compareto(y) == 0 Attenzione all'inserimento in SortedList ecc compareto VS equals x.equals(null) true, false x.compareto(null) NullPointerException BigDecimal non è consistente con l'uguaglianza 78
79 Contratto per Comparable Antisimmetrica Transitiva sgn(x.compareto(y)) = - sgn(y.compareto(x)) x.compareto(y) < 0 & y.compareto(z) < 0 x.compareto(z) <0 Congruenza Rifessiva x.compareto(y) == 0 sgn(x.compareto(z)) == sgn(y.compareto(z)) x.compareto(x) == 0 sgn(x) è il segno di x: -1 negativo, 0 zero, 1 positivo 79
80 Attenzione! public class Integer implements Comparable<Integer>{ public int compareto(integer o) { OK E' il modo giusto di confrontare interi return this.value < o.value? -1 : this.value == o.value? 0 : 1 ; } 80
81 Attenzione! public int compareto(integer o) { return this.value - o.value; } NO! Può generare overfow: confrontando un numero negativo grande in modulo con un grande numero positivo Si può superare Integer.MAX_VALUE 81
82 Overfow/Underfow Overfow: Numero troppo grande in valore assoluto Maggiore di Integer.MAX_VALUE o minore di Integer.MIN_VALUE Underfow: numero, diverso da zero, troppo piccolo in valore assoluto per essere rappresentato dalla macchina 82
83 Trovare il massimo di una collezione public static <T extends Comparable<T>> T max (Collection<T> coll){ T cand = coll.iterator().next(); for (T elem: coll){ if (cand.compareto(elem) < 0) cand = elem; } return cand; } 83
84 Limiti <T extends Comparable<T>> si dice che T è limitato da Comparable T Si è quindi posto un limite sul tipo di T Il limite può essere ricorsivo <T extends C<T,U>, U extends D<T,U>> 84
85 Esempi List<String> stringhe = Arrays.asList("ciao","mondo"); OK assert Collections.max(stringhe).equals("mondo" ); List<Integer> interi = Arrays.asList(1,2,3); OK assert Collections.max(interi) == 2; List<Number> numeri = Arrays.asList(1,2,3,4,5,3.14); assert Collections.max(numeri) == 5; KO Il codice non compila 85
86 Utilizzare frme il più possibile generiche public static <T extends Comparable<T>> T max (Collection<T> coll) public static <T extends Comparable<? super T>> T max ( Collection<? extends T > elements) public static <T extends Object & Comparable<? super T>> T max( Collection<? extends T> coll ) { 86
87 Limiti Multipli public static <S extends Readable & Closeable, T extends Appendable & Closeable> void copy(s src, T dest, int dim)throws IOException{ CharBuffer buff = CharBuffer.allocate(dim); int i = src.read(buff); while (i >= 0 ){ buff.flip(); // prepara per la scrittura dest.append(buff); buff.clear(); i = src.read(buff); } src.close(); dest.close(); } 87
88 Metodi Bridge 1/ Generics sono implementati mediante type erasure Il bytecode è piuttosto simile (e compatibile) con la versione senza Generics Classi che implementano interfacce generiche (es: Comparable<T> ) Vengono aggiunti dal compilatore alcuni metodi detti metodi bridge 88
89 Metodi Bridge 2/ public class Foo1 implements Comparable { private final String value ; public Foo1(String value) { } super(); this.value = value; public int compareto(object o) { } return compareto((foo1) (Foo1)o); public int compareto(foo1 o){ Esempio di Comparable senza Generics Il metodo classico chiama il metodo ridefnito dopo un cast (double dispatch) Attenzione! Java supporta il binding dinamico solamente sull'argomento implicito (this) e non sui parametri formali (quelli tra parentesi) return value.compareto(o.value); } } 89
90 Metodi Bridge 3/ public class Foo2 implements Comparable<Foo2> { private final String value; public Foo2(String value) { } this.value = value; C'è solo un metodo nel codice sorgente Vediamo cosa succede nel bytecode generato dal compilatore... public int compareto(foo2 o) { } return value.compareto(o.value); } 90
91 Bytecode con metodo bridge for (Method m : Foo2.class.getMethods()){ if (m.getname().equals("compareto")) { System.out.println( m.togenericstring()); } } public int Foo2.compareTo(Foo2) public bridge int Foo2.compareTo(java.lang.Object) 91
92 Override covariante (Finalmente!) In java <= 1.4 un metodo può sovrascrivere un altro le due frme coincidono esattamente In java >= 5 un metodo può sovrascrivere un altro se gli argomenti sono identici ed il tipo di ritorno del metodo riscrivente è un sottotipo del tipo di ritorno del metodo riscritto 92
93 Override <= 1.4 public class OldPunto { private final int x; Object ha un metodo clone() che restituisce un Object private final int y; public OldPunto(int x, int y) { this.x = x; this.y = y; } public Object clone() { return new OldPunto(x, y); } } 93
94 Override >= 5.0 public class NewPunto { private final int x; private final int y; NewPunto è sottotipo di Object quindi non ci sono errori di compilazione public NewPunto(int x, int y) { this.x = x; this.y = y; } public NewPunto clone() { return new NewPunto(x, y); } } 94
95 Vediamo se ci sono dei bridge public NewPunto NewPunto.clone() public bridge java.lang.object NewPunto.clone() throws java.lang.clonenotsupportedexception 95
96 Bridge A seconda del compilatore la dicitura bridge: Può non comparire! Può essere sostituita da volatile! (bug) Altro Nel compiatore java6 di Apple non compare bridge 96
97 Parte IV Dichiarazioni di variabili (brevissimo) 97
98 Costruttori public class Coppia<P,S> { private final P primo; private final S secondo; public P getprimo() { return primo; } public S getsecondo() { In una classe generica i parametri di tipo appaiono nell'intestazione che dichiara la classe non nel costruttore! return secondo; } public Coppia(P primo, S secondo) { this.primo = primo; this.secondo = secondo; } } 98
99 Costruttori Coppia<String, Integer> c = new Coppia<String, Integer>("Ciao", 1); OK assert c.getprimo().equals("ciao") && c.getsecondo().equals(1); Coppia<String,Integer> c = new Coppia("Ciao",1); Warning! UncheckedWarning L'istruzione è legale ma genera un warning (non è detto che valga la Cast Iron Guarantee) 99
100 Static 1/ List<Integer> interi = Arrays.asList(1,2,3); List<String> stringhe = Arrays.asList("ciao","mondo"); assert interi.getclass() == stringhe.getclass(); I generics sono implementati tramite type erasure List<String> e List<Integer> a tempo di compilazione sono List 100
101 Static 2/ Type erasure variabili e metodi statici di classi generiche sono condivise tra tutte le istanze della classe le variabili e metodi statici di una classe generica non possono far riferimento ai parametri di tipo della classe accedendo ad un metodo statico di una classe generica il nome della classe non deve essere parametrizzato (con la variabile di tipo) 101
102 Static: esempio 1/ public class Cella<T> { } private final int id; private final T valore; public static int count = 0; public static synchronized int getcount() { return count;} public static synchronized int nextid() { return count++;} public int getid() { return id; } public T getvalore() { return valore;} public Cella( T valore) { this.id = nextid(); this.valore = valore;} 102
103 Static: esempio 2/ Cella<String>cs = new Cella<String>("ciao"); Cella<Integer> ci = new Cella<Integer>(1); Il contatore è condiviso tra tutte le istanze della classe Cella assert cs.getid() == 0 && ci.getid() == 1 && Cella.getCount() == 2; 103
104 Utilizzo di metodi statici Cella.getCount() OK Cella<Integer>.getCount() NO Cella<?>.getCount() NO 104
105 Inner Class 1/ Java permette di annidare una classe dentro un'altra Se la classe esterna ha un parametro di tipo T: Classe interna non statica può accedere direttamente al parametro di tipo T Classe interna statica non può accedere (direttamente) al parametro di tipo T ma esiste un escamotage
106 Inner class non statica public class Esterna<G> {... private class Interna1{ G g = null;... }... } 106
107 Inner class statica: escamotage public class Esterna<G> {... public G getpippo() { return new Interna2<G>().getPippo(); } public static class Interna2<H>{ public H getpippo() {... }
108 Parte V Evoluzione: SI Rivoluzione: NO 108
109 Evoluzione, non rivoluzione Migrare gradualmente il codice all'utilizzo dei generics (evoluzione) senza modifche radicali (rivoluzione) 109
110 Evoluzione L'implementazione dei generics permette che il vecchio codice venga compilato ed eseguito anche con l'utilizzo delle nuove librerie L'evoluzione è più forte della retro compatibilità: non esistono più versioni delle classi e delle librerie ma una sola versione (grazie alla type erasure) compatibile 110
111 Evoluzione Non sempre è possibile mettere mano a tutto il codice È costoso Non abbiamo accesso ai sorgenti Possiamo mettere le mani solo sul client o sulla libreria E' quindi necessario procedere per passi 111
112 Raw type e generic type I raw types sono la controparte legacy dei generic types Generic Raw Stack<E> Stack List<E> List ArrayStack<E> ArrayStack
113 Casi di evoluzione Dovendo utilizzare client con librerie abbiamo 4 casi Client / Libreria Libreria Generic Libreria Legacy Client Generic CG,LG CG,LL Client Legacy CL,LG CL,LL 113
114 Client Generic, Libreria Generic Non pone grossi problemi (è il punto di arrivo) Per arrivare a questo punto di norma tutte le occorrenze di Object vengono sostituite con opportuni parametri di tipo (solo dove ha senso) 114
115 Client Legacy, Libreria Legacy Di norma è il punto di partenza dell'evoluzione in cui sono presenti solo raw type 115
116 Client Legacy, Libreria generica E' il caso più importante di retro compatibilità: il Collection framework di java 5 deve funzionare con i client di java 1.4 Per supportare l'evoluzione, per ogni parametro generico java riconosce anche il suo raw type Ogni tipo parametrico è sottotipo del corrispondente raw type Un oggetto parametrico può quindi essere utilizzato quando ci si aspetta un raw type 116
117 Unchecked conversion warning 1/ Di norma è un errore utilizzare un supertipo di T quando ci si aspetta un oggetto di tipo T Eccezione alla regola: è possibile utilizzare un raw type al posto di uno dei corrispondenti tipi parametrici Viene tuttavia generato un unchecked conversion warning 117
118 List a = Unchecked conversion warning 2/ new ArrayList<String>(); List<String> x = new ArrayList(); OK, normale sottotipizzazione OK ma genera un Unchecked Conversion Warning 118
119 Unchecked conversion warning 3/ Indica che il compilatore non è in grado di ofrire le stesse garanzie che sono possibili quando i generics vengono utilizzati in maniera uniforme Vengono comunque assicurate le stesse (???) garanzie di quando non si utilizzano per niente i generics (!!!) Non vale la cast iron guarantee 119
120 Client generico, Libreria Legacy List l = new ArrayList<String>(); l.add(elem); Il codice compila ma viene generato un Unchecked Call WarninG ---- Pippo.java:7: warning: [unchecked] unchecked call to add(e) as a member of the raw type java.util.list l.add(elem); 120
121 Se i warning vi danno 121
122 Parte VI Reifcazione (si è una parola Italiana) 122
123 Defnizioni di reifcazione Processo mentale mediante il quale a concetti astratti viene assegnata consistenza di cose concrete Nella flosofa di Marx, processo secondo cui nell'economia capitalistica l'uomo e il suo lavoro sono ridotti al valore della merce che producono La reifcazione è una fallacia o un'ambiguità quando un'astrazione (una credenza astratta o un costrutto ipotetico) viene trattata come se fosse un concreto evento reale o un'entità fsica Nell'ambito dell'ingegneria della conoscenza, e in particolare della defnizione di ontologie, la reifcazione è una rappresentazione indiretta che prevede l'utilizzo di determinate espressioni del linguaggio per descrivere entità del mondo reale intuitivamente associate a espressioni di tipo diverso. L'esempio tipico di reifcazione è costituito dall'utilizzo di individui per rappresentare classi. Nel contesto della programmazione orientata agli oggetti si defnisce reifcazione il procedimento di creazione di un modello di dati basato su un concetto astratto predefnito. Mediante la reifcazione, un computer può compiere elaborazioni riguardanti un'entità astratta come se si trattasse di un insieme qualsiasi di dati di altro tipo 123
124 La reifcazione è
125 In java In java un tipo è reifcabile se il tipo è completamente identifcabile a runtime, ovvero se la type erasure non rimuove informazioni utili 125
126 Tipi reifcabili Primitivi es: int Classi o interfacce non parametriche es: String, Comparable Tipi parametrici in cui tutti gli argomenti di tipo sono wildcard non limitati es: List<?> o Map<?,?> Raw type es: List, Map Array di elementi di tipo reifcabile es: int[], List<?>[] 126
127 Tipi non riefcabili Variabili di tipo es: T in Xxxx<T> Tipi parametrici con parametri attuali es: List<String>, Comparable<Integer> Tipi parametrici con un limite es: List<? extends String>, Comparable <? super Number> 127
128 Note In java il tipo di un array viene reifcato con il tipo dei suoi componenti Un tipo parametrico non viene reifcato con il suo parametro di tipo List<?> è equivalente a List<? extends Object> (nel senso di passaggio di parametri) ma il primo è reifcabile il secondo no 128
129 Instance test e cast I test instanceof ed i cast dipendono dall'esame a runtime dei tipi degli oggetti coinvolti e quindi dalla reifcazione Test di istanza verso un tipo non reifcabile errore (di compilazione) Cast ad un tipo non reifcabile genera (di norma) un warning 129
130 Esempio OK public class Myinteger { private final int value; public boolean equals(object o) { if (o instanceof Myinteger){ return this.value == ((Myinteger)o).value; Mynteger è reificabile compila Myinteger è reificabile il cast non genere warning } else return false; }... } 130
131 Equals su liste public abstract class MiaLista<E> extends AbstractCollection<E> implements List<E>{ public boolean equals(object o){ if ( o instanceof List<E>){ Iterator<E> it1 = iterator(); Iterator<E> it2 = ((List<E>)o(List<E>)o ).iterator(); while (it1.hasnext() && it2.hasnext()){ E e1 = it1.next(); E e2 = it2.next(); if (! ( e1 == null? e2== null: e1.equals(e2) ) ){ return false; } } return!it1.hasnext() &&!it2.hasnext(); } else return false; } } 131
132 Equals su liste: analisi public abstract class MiaLista<E> extends AbstractCollection<E> implements List<E>{ public boolean equals(object o){ if ( o instanceof List<E>){ Iterator<E> it1 = iterator(); Errore di compilazione! List<E> non è reificabile Iterator<E> it2 = ((List<E>)o ).iterator(); Unchecked cast warning! while (it1.hasnext()... && it2.hasnext()){ 132
133 Equals su liste: versione fxata public abstract class MiaListaOK<E> extends AbstractCollection<E> implements List<E>{ public boolean equals(object o){ if ( o instanceof List<?>){ Iterator<E> it1 = iterator(); Iterator<?> it2 = ((List<?>)o(List<?>)o ).iterator(); while (it1.hasnext() && it2.hasnext()){ E e1 = it1.next(); Object e2 = it2.next(); if (! ( e1 == null? e2== null: e1.equals(e2) )){ return false; } } return!it1.hasnext() &&!it2.hasnext(); } else return false; } 133
134 Analisi public abstract class MiaListaOK<E> extends AbstractCollection<E> implements List<E>{ public boolean equals(object o){ if ( o instanceof List<?>){ OK List<?> è reificabile Iterator<E> it1 = iterator(); Iterator<?> it2 = ( (List<?>)o ).iterator(); while (... Object e2 = it2.next(); List<?> è reificbaile e non vengono generati warning Da una List<?> posso prelevare Object senza problemi 134
135 Cast non reifcabili Test di istanza verso tipi non reifcabili generano sempre errore In alcune circostanze un cast ad un tipo non reifcabile può non generare warning 135
136 Nessun warning public static <T> List<T> aslist(collection<t> c ) throws IllegalArgumentException { List<?> è reificabile compila if ( c instanceof List<?>){ return (List<T> List<T>)c; } else throw new IllegalArgumentException("Il parametro passato non e' un sottotipo di List<T>"); } Il cast non genera waring in quanto la sorgente del cast ha tipo Collection<T> e ogni oggetto di questo tipo che implementa List deve avere come tipo List<T> 136
137 Unchecked cast Non sempre il compilatore è in grado di capire se un cast verso un tipo non reifcabile avrà successo I sistemi di tipi (dei linguaggi di programmazione orientati agli oggetti) non sono perfetti e non possono individuare situazioni di successo come può fare un (buon) programmatore Per questo motivo un cast verso un tipo non reifcabile non genera un errore ma un warning 137
138 public static List<String> Il cast a logica non fallirà mai converti(list<?> oggetti){ for (Object obj: oggetti){ if (!( obj instanceof String)){ OK String è reificabile throw new IllegalArgumentException( } } return (List<String>)(List<?>)oggetti; } Unchecked Cast il compilatore non è in grado di capire se il cast avrà successo o meno Nota: è illegare castare una lista di oggetti ad una lista di stringhe, quindi serve il doppio cast 138
139 Array e reifcazione Gli array reifcano i loro componenti ovvero conservano a runtime i tipi dei loro componenti 139
140 Un vecchio esempio Integer[] interi = new Integer[] {1,2,3}; Number[] numeri = interi; numeri[2] = 3.14; OK, gli array sono covarianti ArrayStoreException Double non è compatibile con il tipo reificato dell'array 140
141 Creazione di array public static <T> T[] toarray(collection<t> c){ T[] ret= new T[c.size()]; int i = 0 ; for (T x :c){ret[i++] = x;} return ret; NO! errore di compilazione Le variabili di tipo non sono reificabili viene generato un generic array creation error } 141
142 Difetti... Non poter creare array di generics è una limitazione di java Array generici sono problematici a causa della erasure (tuttavia) erasure facilita l'evoluzione In generale dire no! ad array ed utilizzare il Collection Framework 142
143 Refection... Tramite refection è possibile ovviare al problema della creazione di array generici 143
144 Don't try this at home public static <T> T[]toArray(Collection<T> coll){ T[] ret = (T[]) new Object[coll.size()]; Unchecked Cast! int i = 0 ; for (T x :coll){ret[i++] = x;} return ret; } --- List<String> stringhe =... String[] a = toarray(stringhe); Class Cast Exception Exception in thread "main" java.lang.classcastexception: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String; at generics.cap6.ex1.main(ex1.java:23) 144
145 Messaggio oscuro Exception in thread "main" java.lang.classcastexception: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String; at generics.cap6.ex1.main(ex1.java:23) [L signifca array di reference type [LObject signifca array di Object, Object è il component type dell'array L'errore non viene segnalato nel punto in cui viene generato (!) ma in un altro punto (!!!) ovvero nel main 145
146 Versione generata dall'erasure: analisi public static Object[] toarray1( Collection coll){ Object[] ret = (Object[]) Unchecked Cast sparito! new Object[coll.size()]; int i = 0 ; for (Object x :coll){ret[i++] = x;} return ret; } --- List<String> stringhe = Arrays.asList("ciao","mondo"); String[] a = (String[])toArray(stringhe); ClassCastError 146
147 Versione generata dall'erasure: analisi public static Object[] toarray1( Collection coll){ Object[] ret = (Object[]) new Object[coll.size()]; Erasure: converte il cast a T[] in un Cast a Object[] int i = 0 ; for (Object x :coll){ret[i++] = x;} return ret; } --- List<String> stringhe = Arrays.asList("ciao","mondo"); String[] a = (String[])toArray(stringhe); Erasure: inserisce il cast a String[] 147
148 Attenzione! Nonostante l'array contenga solamente stringhe, il suo tipo reifcato è un array di Object! 148
149 Cast iron guarantee (ancora) I cast inseriti dall'erasure non falliscono mai a parte quando viene generato un unchecked cast warning Quando viene generato un unchecked cast warning allora i cast inseriti dalla erasure Possono fallire Possono essere segnalati in parti del codice diferenti da quella che ha generato l'errore 149
150 Adoro i soldi che generano i soldi A volte un modo per fare soldi è tramite altri soldi Lo stesso si può applicare agli array: generare array tramite un altro array 150
151 Array genera array public static <T> T[] toarray( Collection<T> coll, T[] arr){ T[] ret = null; ret = (T[])java.lang.reflect.Array.newInstance (arr.getclass().getcomponenttype(), unchecked cast coll.size()); int i = 0; for (T elem: coll) ret[i++] = elem; return ret; } } 151
152 Esecuzione del codice List<String> a= Arrays.asList("ciao","a"); String[] st = toarray(a, new String[0]); for (String s: st) System.out.println(s); Ok! Funziona! Il metodo getcoponenttype() restituisce un Class Object che rappresente il tipo dei componenti dell'array T Class<?> ctype = arr.getclass().getcomponenttype(); Nel nostro caso è String 152
153 La versione di classe public static <T> T[] toarray( Collection<T> coll, Class<T> classse){ T[] ret = null; ret = (T[])java.lang.reflect.Array.newInstance List<String> a= Arrays.asList("ciao","a"); String[] st2 = toarray(a, String.class); ( Classse, coll.size() ); int i = 0; for (T elem: coll) ret[i++] = elem; return ret; } 153
154 Fine DOMANDE? 154
155 Licenza Creative Commons 2.5 BY NC SA Tu sei libero: di riprodurre, distribuire, comunicare al pubblico, esporre in pubblico, rappresentare, eseguire e recitare quest'opera di modifcare quest'opera Alle seguenti condizioni: Attribuzione. Devi attribuire la paternità dell'opera nei modi indicati dall'autore o da chi ti ha dato l'opera in licenza e in modo tale da non suggerire che essi avallino te o il modo in cui tu usi l'opera. Non commerciale. Non puoi usare quest'opera per fni commerciali. Condividi allo stesso modo. Se alteri o trasformi quest'opera, o se la usi per crearne un'altra, puoi distribuire l'opera risultante solo con una licenza identica o equivalente a questa
156 Appendice Note prese durante lo svolgimento della sessione J&G 156
157 Subtying e controvarianza List estende Collection List<E> estende Collection<E> Se B estende A allora List<B> estende Collection<B> List<B> non estende List<A> ripeto List<B> non estende List<A> 157
158 Wildcard Capture 1/ ---- Map<String,?> map; Iterator<Entry<String,?>> it = map.entryset().iterator(); MyClass.java:9: incompatible types found : java.util.iterator<java.util.map.entry<java.lang.string,capture of?>> required: java.util.iterator<java.util.map.entry<java.lang.string,?>> Iterator<Entry<String,?>> it = map.entryset().iterator(); 158
159 Wildcard Capture 2/ Iterator<Entry<String,capture of?>> non è compatibile con Iterator<Entry<String,?>> "capture of?" non è un sottotipo di "?"? SI! Ma sappiamo che in questo caso abbiamo bisogno che gli argomenti siano esattamente dello stesso tipo. Sappiamo già che List<String> non è un sottotipo di List<Object> ad esempio (generics non sono covarianti) 159
160 Wildcard Capture 3/ "capture of?" signifca che un wildcard deve essere convertito (prima o poi) in una variabile di tipo usando la capture conversion. In "Map<String,?>" ( Map da String ad un tipo ignoto) il secondo parametro è ignoto, ma, ad un certo punto il compilatore dovrà ragionare sul tipo specifco del parametro (java è un linguaggio fortemente tipato*) Il wildcard non può rimanere wild (o meglio, ignoto) per sempre, così il il compilatore catturerà una snapshot di? in una variabile di tipo anonimo ad un certo punto del programma. La diferenza tra? e capture of? è che il primo si riferisce a tutti i possibili tipi, mentre il secondo si riferisce ad un particolare tipi in un particolare punto del programma. In parole povere, prima o poi al posto del wildcard ci andrà messo qualcosa di concreto Esempi presi da 160
161 Capture Durante l'interveto ho utilizzato il termine catturare (corretto) poi ho notato che Bruce Eckel (o meglio il traduttore di Thinking in Java) utilizza il termine intercettare 161
162 Capture Conversion 1/ Ricordiamoci che prima o poi il wildcard dovrà sparire: Istanziazione di oggetti Passaggio di parametri Sarà quindi necessaria prima o poi una conversione di tipo Alcune conversioni di tipo Subtyping (già visto) Numeric promotion (già visto) Widening/Narrowing (esempio da interi a decimali) capture conversione
163 Capture Conversion 2/ public void rebox(box<?> box) { } reboxhelper(box); private<v> void reboxhelper(box<v> box) { } box.put(box.get()); 163
164 Capture Conversion 3/ La chiamata da rebox() a reboxhelper() è sicura, ma non è giustifcabile tramite una relazione si subtyping tra Box<?> e Box<V>. La chiamata è sicura perché l'argomento in ingresso è sicuramente un Box si qualche tipo concreto (seppure ignoto). Se possiamo cattrurare questo tipo ignoto in una variabile di tipo X allora possiamo dedurre che V sia X Questa è l'essenza della capture conversion! tratto da Java Language Specifcations
Java Generics. Sunto di quanto letto nel libro Java Generics and Collections di Maurice Naftalin & Philip Wadler O'REILLY
Java Generics Sunto di quanto letto nel libro Java Generics and Collections di Maurice Naftalin & Philip Wadler O'REILLY Le Novità I GENERICI sono (forse) la modifica più corposa fra quelle inserite nella
Generics in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A
Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2009-2010 Alessandro Longheu http://www.diit.unict.it/users/alongheu alessandro.longheu@diit.unict.it Generics in Java 1 Cosa sono i Generics?
Cosa sono i Generics?
Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2008-2009 Alessandro Longheu http://www.diit.unict.it/users/alongheu alessandro.longheu@diit.unict.it - lezione 22 - Generics in Java 1 Cosa
Polimorfismo parametrico vs polimorfismo per inclusione
Polimorfismo parametrico vs polimorfismo per inclusione Esercizio Definire il tipo di dato Stack con operazioni Push( element ) Pop() Non forzare una specifica implementazione Non forzare un tipo specifico
Introduzione Generics Iteratori. Collezioni in Java. Dr. Giulio Pellitta. 13 aprile 2011
13 aprile 2011 Cos è una collezione? Gerarchia delle collezioni Introduzione Una collezione è semplicemente un oggetto che raggruppa più oggetti (detti elementi della collezione) in una singola unità.
JAVA GENERICS. Angelo Di Iorio Università di Bologna
JAVA GENERICS Angelo Di Iorio Università di Bologna Tipi parametrici In diversi casi è utile definire classi che operano su tipi di dato diverso e implementano un comportamento comune e indipendente dal
Implementare un'interfaccia
Le interfacce Un metodo astratto è un metodo senza corpo, con un ";" dopo l'intestazione. Una interfaccia (interface) in Java ha una struttura simile a una classe, ma può contenere SOLO costanti e metodi
Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)
Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I) Ing. Gianluca Caminiti Sommario ( OOP ) Programmazione Object-Oriented Incapsulamento, Ereditarietà, Polimorfismo Richiami
19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo
19 - Eccezioni Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso
Programmazione ad oggetti
DAIS Univ. Ca' Foscari Venezia Programmazione ad oggetti Samuel Rota Bulò Programmazione polimorfa Immaginiamo di voler creare una classe Stack. Il funzionamento di uno stack può essere definito indipendentemente
3. Il sistema dei tipi I tipi wrapper
3. Il sistema dei tipi I tipi wrapper Marco Faella Dip. Ing. Elettrica e Tecnologie dell'informazione Università di Napoli Federico II Corso di Linguaggi di Programmazione II Il sistema dei tipi Il inguaggio
3. Il sistema dei tipi I tipi wrapper
3. Il sistema dei tipi I tipi wrapper Marco Faella Dip. Ing. Elettrica e Tecnologie dell'informazione Università di Napoli Federico II Corso di Linguaggi di Programmazione II Il sistema dei tipi Il inguaggio
Il linguaggio Java: aggiunte in Java 1.5
.. Il linguaggio Java: aggiunte in Java 1.5 Una breve presentazione GENERICI Java 1.5 introduce i generici: classi che hanno un parametro di tipo. Nelle versioni precedenti a Java 1.5 si può definire:
Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014
Cognome................................ Nome................................... Matricola............................... Programmazione Prova scritta del 11 luglio 2014 TEMPO DISPONIBILE: 2 ore Negli esercizi
Cenni su programmazione con tipi generici (generics)
Cenni su programmazione con tipi generici (generics) Tipi generici (generics) Programmazione generica: Creazione di costrutti che possono essere utilizzati con tipi di dati diversi Es. ArrayList,
Cosa sono i Generics?
Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2007-2008 Alessandro Longheu http://www.diit.unict.it/users/alongheu alessandro.longheu@diit.unict.it - lezione 13 - Generics in Java 1 Cosa
Capitolo 5. Array e collezioni. c 2005 Pearson Education Italia Capitolo 5-1 / 61
Capitolo 5 Array e collezioni c 2005 Pearson Education Italia Capitolo 5-1 / 61 Sommario: Array e collezioni 1 Array Array di oggetti Lunghezza di un array Accesso agli elementi di un array Array e cicli
Programmazione Java Struttura di una classe, Costruttore, Riferimento this
Programmazione Java Struttura di una classe, Costruttore, Riferimento this romina.eramo@univaq.it http://www.di.univaq.it/romina.eramo/tlp Roadmap > Struttura di una classe > Costruttore > Riferimento
Richiami Java e Arrays
Richiami Java e Arrays concetti base G.T. 1 casting G.T. 1.3.3 e 2.5 uso array G.T. 3.1 lista semplice G.T. 3.2 1 Concetti base Oggetto istanza (di una classe) classe (tipo di un oggetto) variabili di
Capitolo 7 Un primo sguardo agli oggetti Schema e valori Elementi di classe e d istanza
I Sommario Prefazione xiii Capitolo 1 Introduzione alla programmazione 1 1.1 Hardware e software......................... 1 1.2 La programmazione......................... 4 1.2.1 I paradigmi di programmazione...............
Inizializzare oggetti
Inizializzare oggetti Uso della Classe Software per TLC - AA 2008/2009 1 Costruttori e polimorfismo Uso della Classe Un codice migliore Software per TLC - AA 2008/2009 2 Costruttori ed Ereditarietà Output:
Esempio su strutture dati dinamiche: ArrayList
Esempio su strutture dati dinamiche: ArrayList 1 ArrayList! Abbiamo detto che gli array non possono cambiare la propria dimensione: il numero di elementi contenuti viene stabilito al momento della creazione
Programmazione Java Avanzata Programmazione Object- Oriented in Java
Programmazione Java Avanzata Programmazione Object- Oriented in Java Ing. Gianluca Caminiti Testi di Riferimento (Java) Cay Horstmann Concetti di informatica e fondamenti di Java Apogeo, 2007 (Versione
OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO
CENTRO STUDI ULISSE Via Buccino, n. 22 - C.a.p. 84018 - Scafati (SA) Tel. Fax. 081.19970299-339.2365416-349.4152010 E-mail: info@centrostudiulisse.it - www.centrostudiulisse.it OCA JAVA 7 SE PROGRAMMER
Cast implicito. Il cast è fatto automaticamente quando un tipo più basso viene assegnato ad un tipo più alto. byte short int long float double
Il cast Cast implicito Il cast è fatto automaticamente quando un tipo più basso viene assegnato ad un tipo più alto Per esempio: byte short int long float double int x = 10; float f; f = x; Il valore di
Programmazione Java Struttura di una classe, Costruttore, Riferimento this
Programmazione Java Struttura di una classe, Costruttore, Riferimento this Davide Di Ruscio Dipartimento di Informatica Università degli Studi dell Aquila diruscio@di.univaq.it. Sommario 2 2» Struttura
Collezioni, mappe e iteratori (a cura del Prof. Marco Patella)
, mappe e iteratori (a cura del Prof. Marco Patella) 1 Introduzione al Java Collections Framework Una collezione (o contenitore) consente di organizzare e gestire un gruppo di oggetti collezioni (vere
OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO
CENTRO STUDI ULISSE Via Buccino, n. 22 - C.a.p. 84018 - Scafati (SA) Tel. Fax. 081.19970299-339.2365416-349.4152010 E-mail: info@centrostudiulisse.it - www.centrostudiulisse.it OCA JAVA 7 SE PROGRAMMER
Programmazione. ( a.k.a. Generics )
Programmazione Parametrica ( a.k.a. Generics ) Programmazione parametrica: introduzione Generics e relationi di sottotipo wildcards generics e vincoli Implementazione di classi e metodi parametrici Supporto
Programmazione Parametrica ( a.k.a. Generics )
Programmazione Parametrica ( a.k.a. Generics ) Programmazione parametrica: introduzione Generics e relationi di sottotipo wildcards generics e vincoli Implementazione di classi e metodi parametrici Supporto
Oggetti e dati primitivi 1
I membri delle classi Oggetti e dati primitivi Corso di laurea in Le classi contengono 2 tipi di membri, definiti per l intera classe o per le singole istanze Le variabili o i campi, che rappresentano
Marco Faella Introduzione al corso
Marco Faella Introduzione al corso 1 Lezione n. Parole chiave: Java Corso di Laurea: Informatica Insegnamento: Linguaggi di Programmazione II Email Docente: faella.didattica@gmail.com A.A. 2009-2010 Linguaggi
Esempio su strutture dati dinamiche: ArrayList
Esempio su strutture dati dinamiche: ArrayList 1 ArrayList Abbiamo detto che gli array non possono cambiare la propria dimensione: il numero di elementi contenuti viene stabilito al momento della creazione
Parte I Java. Metodologie di Programmaziona Secondo Appello, 14/2/2006 1
Metodologie di Programmaziona 05 06 Secondo Appello, 14/2/2006 1 Parte I Java Considerate le seguenti definizioni di classe. class T { class S extends T { class A { public void print(string s) { System.out.println(s);
Linguaggi di programmazione II AA 2010/2011 Esercitazione 2
Linguaggi di programmazione II AA 2010/2011 Esercitazione 2 1) Scrivere l'output del seguente programma Java public class Bean private String str; Bean(String str ) this.str = str; public String tostring()
Programmazione Parametrica ( a.k.a. Generics )
Programmazione Parametrica ( a.k.a. Generics ) Programmazione parametrica: introduzione Generics e relationi di sottotipo wildcards generics e vincoli Implementazione di classi e metodi parametrici Supporto
Utilizza i tipi di dati comuni a tutto il framework.net Accesso nativo ai tipi.net (C# è nato con.net) Concetti fondamentali:
1 Tipi di dati 1 Tipi di dati Utilizza i tipi di dati comuni a tutto il framework.net Accesso nativo ai tipi.net (C# è nato con.net) Concetti fondamentali: Tutto è un oggetto Tutto eredita implicitamente
Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre 2014. Negli esercizi proposti si utilizzano le seguenti classi:
Cognome................................ Nome................................... Matricola............................... Programmazione Prova scritta del 22 settembre 2014 TEMPO DISPONIBILE: 2 ore Negli
Esempio su strutture dati dinamiche: ArrayList
Esempio su strutture dati dinamiche: ArrayList 1 ArrayList Gli array non possono cambiare la propria dimensione: il numero di elementi contenuti viene stabilito al momento della creazione e rimane immutato.
SOMMARIO Tipo di dato astratto (ADT) : Interfacce: interface. TIPI DI DATI ASTRATTI. Polimorfismo: Tipo class. Tipo interface. Tipi run-time: is e as.
SOMMARIO Tipo di dato astratto (ADT) : Interfacce: interface. Polimorfismo: Tipo class. Tipo interface. Tipi run-time: is e as. Confronto tra oggetti: Equals(). IComparable. IComparer. TIPI DI DATI ASTRATTI
INFORMATICA III Parte B -Progettazione e Algoritmi
INFORMATICA III Parte B -Progettazione e Algoritmi Implementazione di codice algoritmico in Java Patrizia Scandurra patrizia.scandurra@unibg.it Università degli Studi di Bergamo a.a. 2010-11 Stessa interfaccia,
Le basi del linguaggio Java
Le basi del linguaggio Java Compilazione e interpretazione Quando si compila il codice sorgente scritto in Java, il compilatore genera il codice compilato, chiamato bytecode. È un codice generato per una
Lists. Arrays reloaded
Lists Arrays reloaded Collection Family Tree 2 Lists == Arrays Reloaded Lists are (probably) the most widely used Java collections Like arrays full visibility and control over the ordering of its elements
Introduzione a C# Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni
Introduzione a C# Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni C#: Strumento Principe per.net Primo linguaggio orientato alle componenti della famiglia C/C++ Tutto è DAVVERO un oggetto
Java generics PR
Java generics 1 Java: Interface e astrazione interface ListOfNumbers { boolean add(number elt); Number get(int index); interface ListOfIntegers { boolean add(integer elt); Integer get(int index); e ListOfStrings
Programmazione I - corso B a.a prof. Viviana Bono
Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a. 2009-10 prof. Viviana Bono Blocco 12 Riepilogo e complementi sui tipi Ripasso del sistema di tipi
Uguaglianza e copia di oggetti
Uguaglianza e copia di oggetti Sommario 1. Classi Object e Class 2. Uguaglianza superficiale e uguaglianza profonda 3. Copia superficiale e copia profonda 4. Uguaglianza e copia in classi derivate 1 La
Sommario. I Uso degli oggetti 39
Questo è l'indice del libro, in cui sono evidenziati i paragrafi corrispondenti agli argomenti trattati nel corso e che costituiranno il programma d'esame. Alcuni argomenti sono stati trattati nelle lezioni
Lezione 6 Introduzione al C++ Mauro Piccolo
Lezione 6 Introduzione al C++ Mauro Piccolo piccolo@di.unito.it Linguaggi di programmazione Un linguaggio formale disegnato per descrivere la computazione Linguaggi ad alto livello C, C++, Pascal, Java,
Oggi. La programmazione strutturata - III. Sequenza e selezione. Dove siamo. Iterazione: while e do/while. Raffinamenti successivi.
La programmazione strutturata - Stefano Mizzaro Dipartimento di matematica e informatica Università di Udine http://www.dimi.uniud.it/mizzaro/ mizzaro@dimi.uniud.it Programmazione, lezione 6 Oggi Stefano
Conoscere l uso delle collezioni in Java. Conoscere il concetto di Generics (programmazione
1 Conoscere l uso delle collezioni in Java Comprendere le principali caratteristiche nelle varie classi di Collection disponibili Saper individuare quali classi di Collection usare in casi specifici Conoscere
Polimorfismo per Genericità in Java
Polimorfismo per Genericità in Java Corso di Linguaggi di Programmazione ad Oggetti 1 A.A. 2003/04 A cura di Polimorfismo Polimorfismo Ad-Hoc: Overloading Un metodo può essere sovraccaricato per manifestare
OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO
CENTRO STUDI ULISSE Via Buccino, n. 22 - C.a.p. 84018 - Scafati (SA) Tel. Fax. 081.19970299-339.2365416-349.4152010 E-mail: info@centrostudiulisse.it - www.centrostudiulisse.it OCA JAVA 7 SE PROGRAMMER
Liste doppie. Doubly Linked Lists. GT: 6.2 (e 3.3) Argomenti della lezione
Liste doppie GT: 6.2 (e 3.3) Doubly Linked Lists 1 Argomenti della lezione ADT Position NodeList interface Position PositionList class DNode NodePositionList inserzione rimozione Iteratore ADT Iterator
Università Ca Foscari DAIS. Programmazione ad Oggetti. Esame del modulo 1
Università Ca Foscari DAIS Programmazione ad Oggetti Esame del modulo 1 Nome: Matricola: Samuel Rota Bulò, a.a. 2012/2013 Programmazione ad Oggetti a.a. 2012/2013 Esame del modulo 1 Nome: Samuel Rota Bulò
Programmazione in Java (I modulo) Lezione 21: Classi derivate e l'operatore instanceof Riscrivere il metodo tostring() Riscrivere il metodo equals()
Programmazione in Java (I modulo) Lezione 21: Classi derivate e l'operatore instanceof Riscrivere il metodo tostring() Riscrivere il metodo equals() Ereditarietà (Inheritance) RIASSUMIAMO DALLA SCORSA
18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo
18 - Vettori Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://pages.di.unipi.it/milazzo milazzo di.unipi.it Corso di
Programmazione a Oggetti Lezione 11. Eccezioni e Packages
Programmazione a Oggetti Lezione 11 Eccezioni e Packages Sommario Eccezioni Sollevamento Cattura Trattamento Packages e visibilità Eccezioni I programmi spesso si trovano ad operare in condizioni anomale:
Capitolo 6. Uso della gerarchia. c 2005 Pearson Education Italia Capitolo 6-1 / 125
Capitolo 6 Uso della gerarchia c 2005 Pearson Education Italia Capitolo 6-1 / 125 Sommario: Uso della gerarchia 1 Notazione UML per le classi 2 Introduzione alla gerarchia 3 Gerarchia e tipi La gerarchia
Corso di Fondamenti di Informatica
Corso di Fondamenti di Informatica Puntatori a funzioni 1 Funzioni che restituiscono puntatori Il valore di ritorno restituito da una funzione può essere di qualsiasi tipo, compreso il tipo puntatore.
Programmazione in Java (I modulo) Lezione 4
Programmazione in Java (I modulo) Lezione 4 Costanti Chiamiamo costanti tutti i valori numerici (interi o con la virgola), i caratteri e le stringhe. Esempio: 2, 3.7, 'y, buongiorno Le costanti numeriche
Programmazione in Java (I modulo)
Programmazione in Java (I modulo) Lezione 4 Variabili di tipo primitivo. Dichiarazione di costanti Conversioni di tipo: operatore cast Altri operatori di assegnamento Operazioni aritmetiche e di confronto
Introduzione a Java e all'ambiente di sviluppo
Introduzione a Java e all'ambiente di sviluppo Programmazione 2, a.a. 2006-2007 Nota: per esclusivo uso interno al corso, riferimenti bibliografici forniti a lezione Schema minimo di un applicazione public
Introduzione a Java. Riferimenti
Introduzione a Java Si ringraziano Massimiliano Curcio e Matteo Giacalone 1: Introduction 1 Riferimenti! Java tutorial: http://java.sun.com/docs/books/tutorial/! Il Java tutorial è parte di una più ampia
! Riassunto. ! for. ! Cicli annidati. ! Esempi, esercizi, errori tipici. ! Programmazione strutturata. ! break e continue I1; I2; I3;
La programmazione strutturata - Stefano Mizzaro Dipartimento di matematica e informatica Università di Udine http://www.dimi.uniud.it/mizzaro/ mizzaro@uniud.it Programmazione, lezione 6 Oggi Stefano Mizzaro
Subtype Polymorphism. Conversioni di tipo. Conversioni di tipo. Subtyping. Conversioni di tipo. Interfacce e subtype polimorfismo
Subtype Polymorphism Interfacce e subtype polimorfismo Tipi, sottotipi e conversioni di tipo Polimorfismo e dinamic dispatch Conversioni di tipo Variabile: locazione con un tipo associato Tipo della variabile
Riuso di classi. Ereditarietà. Ereditarietà. Spesso si ha bisogno di classi simili
Riuso di classi Spesso si ha bisogno di classi simili Si vuole cioè riusare classi esistenti per implementare attributi e metodi leggermente diversi Non è pratico copiare la classe originaria e modificarne
Fondamenti di Informatica T-1
Fondamenti di Informatica T-1 Interfaccia Comparable e Collezioni Tutor: Allegra De Filippo allegra.defilippo@unibo.it a.a. 2015/2016 Fondamenti di Informatica T-1 Allegra De Filippo 1 / 22 Interfaccia
Concetti Base Encapsulation ed Ereditarietà Programmare con l Ereditarietà. Java: Ereditarietà. Damiano Macedonio
Dipartimento di Informatica, Università degli Studi di Verona Corso di Programmazione per Bioformatica Introduzione Ereditarietà in Sintesi È uno dei concetti chiave della programmazione orientata agli
JSON JavaScript Object Notation. Sistemi Informativi Aziendali A.A. 2012/2013
JSON JavaScript Object Notation Sommario 1. Obiettivo 2. La rappresentazione JSON 3. Librerie Java per JSON 4. Utilizzo di JSON in JavaScript 2 Obiettivo JSON JavaScript Object Notation Obiettivo Nell
Determinazione del tipo
1 Determinazione del tipo Point NamedPoint public static void main(string a[]){ Point p; // leggi k if (k==1) p=new Point(2,2); else p=new NamedPoint(3,3, A ); // p.getname(); SBAGLIATO! if (p instanceof
OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO
CENTRO STUDI ULISSE Via Buccino, n. 22 - C.a.p. 84018 - Scafati (SA) Tel. Fax. 081.19970299-339.2365416-349.4152010 E-mail: info@centrostudiulisse.it - www.centrostudiulisse.it OCA JAVA 7 SE PROGRAMMER
IL LINGUAGGIO JAVA. Introduzione alla sintassi di Java La sintassi formalizza le regole sintattiche per scrivere frasi ben formate
Fondamenti di Informatica IL LINGUAGGIO JAVA Sintassi, Semantica, Input, Tipi Elementari e Istruzione Condizionale 1 Introduzione alla sintassi di Java La sintassi formalizza le regole sintattiche per
Fornisce una interfaccia unificata per un insieme di interfacce di un sottosistema, rendendo più facile l uso di quest ultimo.
Facade 73 10. Facade (GoF pag. 185) 10.1. Descrizione Fornisce una interfaccia unificata per un insieme di interfacce di un sottosistema, rendendo più facile l uso di quest ultimo. 10.2. Esempio Un applicativo
Indice generale Introduzione...vii Parte I Concetti e costrutti fondamentali... 1 Capitolo 1 Introduzione al linguaggio... 3
Introduzione...vii Organizzazione del libro... viii Struttura del libro e convenzioni... ix Codice sorgente e progetti... x Compilare ed eseguire direttamente i listati e gli snippet di codice... x Compilare
Ricerca e ordinamento su array di oggetti. Corso di Programmazione 2 Esercitazione 5
Ricerca e ordinamento su array di oggetti Corso di Programmazione 2 Esercitazione 5 Sommario Ricercare in array di oggetti Interfaccia comparable Ordinare array di oggetti Problema Come ordinare, ricercare
STRUTTURE DINAMICHE. (slide: A. Baratè L.A. Ludovico) Programmazione per la Musica Adriano Baratè
STRUTTURE DINAMICHE (slide: A. Baratè L.A. Ludovico) Programmazione per la Musica Adriano Baratè DIFFERENZE RISPETTO AD ARRAY Finora le collezioni di dati sono state dichiarate come array (di stringhe,
Fondamenti di Informatica I
Sapienza Università di Roma, Facoltà di Ingegneria Corso di Fondamenti di Informatica I Canale 1 (A-K) Anno Accademico 2009-2010 Corso di Laurea in Ingegneria Informatica Docente: Camil Demetrescu Esercitatore:
OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO
CENTRO STUDI ULISSE Via Buccino, n. 22 - C.a.p. 84018 - Scafati (SA) Tel. Fax. 081.19970299-339.2365416-349.4152010 E-mail: info@centrostudiulisse.it - www.centrostudiulisse.it OCA JAVA 7 SE PROGRAMMER
Programmazione II Compitino (Vers. B)
Programmazione II Compitino (Vers. B) 15 gennaio 2015 Cognome Jackson Nome Michael Matricola 696969 Anno di corso 1 Nei seguenti quesiti, quando vi è richiesto di scrivere un programma, potete limitarvi
Indice. Prefazione. 3 Oggetti e Java 53
Prefazione xv 1 Architettura dei calcolatori 1 1.1 Calcolatori e applicazioni 1 1.1.1 Alcuni esempi di applicazioni 3 1.1.2 Applicazioni e interfacce 4 1.2 Architettura dei calcolatori 7 1.2.1 Hardware
Ereditarietà (ultima)
Ereditarietà (ultima) Classi astratte Un ibrido tra classi e interfacce Hanno alcuni metodi implementati normalmente, altri astratti Un metodo astratto non ha implementazione abstract class AccountTransaction...
Ereditarietà (ultima)
Ereditarietà (ultima) Classi astratte Un ibrido tra classi e interfacce Hanno alcuni metodi implementati normalmente, altri astratti Un metodo astratto non ha implementazione abstract class AccountTransaction
Le eccezioni in Java
Eccezioni 1 Le eccezioni in Java i tipi di eccezione sono particolari classi che contengono solo il costruttore ci possono essere più costruttori overloaded sono definite in moduli separati da quelli che
Esempi in Java di program.ne O-O
Esempi in Java di program.ne O-O Ereditarietà Polimorfismo statico e dinamico Esercitazione laboratorio Interfaccia Comparable e Comparator 1 Gerarchia di ereditarietà Persona IS_A Docente Studente Tecnico
Corso di Linguaggi di Programmazione
Corso di Linguaggi di Programmazione Lezione 19 Alberto Ceselli alberto.ceselli@unimi.it Dipartimento di Informatica Università degli Studi di Milano 14 Maggio 2013 Idea Programma = Algoritmi + Strutture
Sul pattern Iterator
Sul pattern Iterator 1 Introduzione Capita spesso di aver a che fare con strutture dati complesse, come ad esempio, liste, code, ecc. È buona norma accedere a queste strutture senza esporre la loro organizzazione.
Laboratorio di reti I
Laboratorio di reti I Stefano Brocchi brocchi@dsi.unifi.it 13 ottobre, 2009 Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 1 / 27 Introduzione Obiettivi del corso Aspetti di programmazione Java
ALGORITMI E STRUTTURE DATI
Esercitazioni del corso di: ALGORITMI E STRUTTURE DATI Tutor: Francesca Piersigilli email: francesca.piersigilli@unicam.it Strutture dati elementari Tecniche di organizzazione dei dati: scelta della struttura
Java e i Tipi di dati primitivi. Parte 3
Java e i Tipi di dati primitivi Parte 3 La nozione di tipo di dato Il tipo del dato consente di esprimere la natura del dato Indica il modo con cui verrà interpretata la sequenza di bit che rappresenta
Esempio su strutture dati dinamiche: ArrayList
Esempio su strutture dati dinamiche: ArrayList Fondamenti di Informatica L-B 1 ArrayList Abbiamo detto che gli array non possono cambiare la propria dimensione: il numero di elementi contenuti viene stabilito
Java. Classi Anonime In Java Da Java 1.1 si possono usare classi anonime per implementare interfacce. Espressioni Lambda. Implementazione Interfaccia
Java I nuovi paradigmi e linguaggi tendono a semplificare il lavoro del programmatore, nascondendo dentro le librerie (o i costrutti del linguaggio) parte della programmazione necessaria Da Java 5, in
Arrays Array L ay ist
Arrays Array Lists Arrays Array: una sequenza di valori dello stesso tipo double[] data = new double[10]; Continua Arrays Al momento della allocazione, tutti i valori sono inizializzati ai valori di default
Gerarchie e polimorfismo: liste
Gerarchie e polimorfismo: liste 1 Generalizzare le liste di interi List lista di oggetti non modificabile vorremo poi definire un sottotipo versione ordinata 2 List classe astratta usate i sottotipi per
Università Ca Foscari DAIS. Programmazione ad Oggetti. Esame del modulo 1
Università Ca Foscari DAIS Programmazione ad Oggetti Esame del modulo 1 Nome: Matricola: Samuel Rota Bulò, a.a. 2012/2013 Programmazione ad Oggetti a.a. 2012/2013 Esame del modulo 1 Nome: Samuel Rota Bulò
Gli ARRAY. Corso di Programmazione Cefi Informatica
VB.NET Gli ARRAY Gli array a una dimensione Gli array, o vettori, sono spazi di memoria in cui vengono immagazzianti in massa più variabili dello stesso tipo, accessibili tramite un indice. Prendiamo un
Agent and Object Technology Lab Dipartimento di Ingegneria dell Informazione Università degli Studi di Parma. Ingegneria del software A
Agent and Object Technology Lab Dipartimento di Ingegneria dell Informazione Università degli Studi di Parma Ingegneria del software A Collezioni di oggetti (in Java) Michele Tomaiuolo Framework Framework
Riassunto: cos è la OOP? classi astratte, interfacce, classi interne. Scaletta. Figura con area()? Figura senza area()? Stefano Mizzaro 1.
OO in Java: classi astratte, interfacce, classi interne Stefano Mizzaro Dipartimento di matematica e informatica Università di Udine http://www.dimi.uniud.it/mizzaro mizzaro@dimi.uniud.it Programmazione,