Programmazione. ( a.k.a. Generics )

Documenti analoghi
Programmazione Parametrica ( a.k.a. Generics )

Cosa sono i Generics?

Polimorfismo per Genericità in Java

Capitolo 16. Programmazione generica. Cay S. Horstmann Concetti di informatica e fondamenti di Java quarta edizione

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

Cosa sono i Generics?

Il linguaggio Java: aggiunte in Java 1.5

Astrazioni Polimorfe e Tipi Generici

Subtype Polymorphism. Conversioni di tipo. Conversioni di tipo. Subtyping. Conversioni di tipo. Interfacce e subtype polimorfismo

Programmazione generica

Collezioni, mappe e iteratori (a cura del Prof. Marco Patella)

Collezioni. (a cura del Prof. Marco Patella)

Polimorfismo parametrico vs polimorfismo per inclusione

Esercizio: Lista Circolare

Generics & Collections

Capitolo 17. Introduzione alle strutture di dati. Capitolo 17 Introduzione alle strutture di dati

Generic. Contenitori generici per oggetti realizzati tramite il concetto di tipo parametrico. IL NUOVO APPROCCIO (java 1.5)

Esempio 2: Subtyping

Corso di Linguaggi di Programmazione

Corso di Linguaggi di Programmazione

Corso di Algoritmi e Strutture Dati con Laboratorio. Java Collections Framework (I parte)

STRUTTURE DATI: OLTRE GLI ARRAY LISTE

Linguaggi di programmazione II AA 2010/2011 Esercitazione 2

Programmazione orientata agli oggetti Classi astratte e interfacce

Esempio su strutture dati dinamiche: ArrayList

Esempio su strutture dati dinamiche: ArrayList

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

OCA JAVA 8 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Testo di Riferimento (usato nei corsi precedenti)

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Capitolo 14 Introduzione alle strutture di dati. Cay S. Horstmann Concetti di informatica e fondamenti di Java quarta edizione

Metodologie di Programmazione. ovvero, Principi e Tecniche per la costruzione di programmi

Introduzione Generics Iteratori. Collezioni in Java. Dr. Giulio Pellitta. 13 aprile 2011

Ereditarietà (ultima)

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

Esempio su strutture dati dinamiche: ArrayList

Scope e visibilità per classi

Metodi di una Collection

Risoluzione dei metodi

Corso di Fondamenti di Informatica I

Variabili e Parametri. Scope, Lifetime Inizializzazione

Variabili e Parametri

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo

TIPI PRIMITIVI E CLASSI WRAPPER

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

La classe java.lang.object

Capitolo 6. Uso della gerarchia. c 2005 Pearson Education Italia Capitolo 6-1 / 125

Generics. L8 Linguaggi prog. II Unina 2

Implementazione Java di un ADT

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Ingegneria del Software 1: Generici e Collezioni

Fondamenti di informatica Oggetti e Java. Luca Cabibbo. Collezioni++ (Aggiunte di Marco Patella) Capitolo 26.bis. aprile 2006.

3. Il sistema dei tipi I tipi wrapper

Liste concatenate. Collezione ordinata di nodi. Carlo Paolo Simona. Anna. ciascun nodo contiene due riferimenti:

Fondamenti di Informatica L-B Esercitazione n 6 Java: Collezioni, Classe Wrapper & Generics

Le collezioni di oggetti. Prof. Accarino IIS Altiero Spinelli via Leopardi 132 Sesto San Giovanni

Corso di Linguaggi di Programmazione

18 - Classi parzialmente definite: Classi Astratte e Interfacce

Oggetti. Interfacce e sottotipi

Programmazione a Oggetti Lezione 7. Il linguaggio Java: aspetti generali

# $ $ A.A. 2006/07 Tutor: Daniele Tiles &== ? &7$ %% & '( ) * + $, $ $ -' %./, $ * $ $ 7 5 &7 2$ $ $ 3&4&&&

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali. Esempio Animali

Programmazione Java Avanzata Programmazione Object- Oriented in Java

Riassunto: cos è la OOP? classi astratte, interfacce, classi interne. Scaletta. Figura con area()? Figura senza area()? Stefano Mizzaro 1.

Università Ca Foscari DAIS. Programmazione ad Oggetti. Esame del modulo 1

Programmazione ad oggetti

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Esonero del corso di Programmazione a Oggetti

Classi, Ereditarietà e Polimorfismo. Lezione 7

Bank. Bank. BankAccount. Bank. Bank. private BankAccount[] conti; // Posizione attuale private int posizioneattuale;...

Introduzione alla Java Collections Framework

16 - Ereditarietà, tipi e gerarchie

16 - Ereditarietà, tipi e gerarchie

Notazione grafica UML

Liste doppie. Doubly Linked Lists. GT: 6.2 (e 3.3) Argomenti della lezione

Java Classi wrapper e classi di servizio. Classi di servizio

Esonero del corso di Programmazione a Oggetti

Silvia Crafa

Uso di metodi statici. Walter Didimo

Università Ca Foscari DAIS. Programmazione ad Oggetti. Esame del modulo 1

Definizione di classi. Walter Didimo

Esempio: Costruttori ed ereditarietà

Programmazione orientata agli oggetti Subtyping e polimorfismo

Il Linguaggio Java. Le interfacce

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

Programmazione Java: Polimorfismo

Programmazione con Java

Perché il linguaggio C?

Java vs Ocaml. Una prima analisi

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali. Esempio Animali

C# delegates. Vittorio Maniezzo Università di Bologna. Vittorio Maniezzo Università di Bologna 1. Delegate

Progettazione By Contract

Introduzione al Java Collections Framework. Java Collections Framework (cont.) Interfacce del Collections Framework

Problema:garantire a compile time la coerenza dei dati di una collezione

cap.6 del testo a cosa servono i tipi nei linguaggi di programmazione cos è un linguaggio type safe

L ereditarieta` Riuso del software: Ereditarieta`, Composizione, Polimorfismo e Binding Dinamico Ereditarietà Ereditarietà

Introduzione al Java Collections Framework

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Transcript:

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 per i generics nella JVM Collections

Programmazione polimorfa Polimorfo ~ multiforme, di molti tipi Programmazione polimorfa: creazione di costrutti (classi e metodi) che possono essere utilizzati in modo uniforme su dati di tipo diverso In Java, tradizionalmente ottenuta mediante i meccanismi di sottotipo ed ereditarietà Da Java 1.5. anche mediante i meccanismi di parametrizzazione di tipo (a.k.a. generics)

Variabili di Tipo Le variabili (o parametri) di tipo pemettono di creare astrazioni di tipo Classico caso di utilzzo nelle classi Container public class Set<E> public ArrayList()... public void add(e element)...... E = variabile di tipo astrae (e rappresenta) il tipo delle componenti Continua

Variabili di Tipo Possono essere istanziate con tipi classe o interfaccia ArrayList<BankAccount> ArrayList<Measurable> Vincolo: tipi che istanziano variabili di tipo non possono essere primitivi (devono essere tipi riferimento) ArrayList<double> // No! Classi wrapper utili allo scopo ArrayList<Double>

Variabili di tipo e controlli di tipo Utilizzare variabili di tipo nella programmazione permette maggiori controlli sulla correttezza dei tipi in fase di compilazione Aumenta quindi la solidità e robustezza del codice Continua

Variabili di tipo e controlli di tipo Un classico caso di utilizzo di containers List intlist = new LinkedList(); intlist.add(new Integer(57)); Integer x = (Integer) intlist.get(0); Il cast è problematico, per vari motivi verboso, fonte di errori a run time Ma necessario per la compilazione e per localizzare l eventuale errore a run time Continua

Variabili di tipo e controlli di tipo Container generici: più sintetici ed eleganti List<Integer> intlist = new LinkedList<Integer>(); intlist.add(new Integer(0)); Integer x = intlist.get(0); Compilatore può stabilire un invariante sugli elementi della lista garantire l assenza di errori a run-time in forza di quell invariante. Continua

Variabili di tipo e controlli di tipo List<Integer> intlist = new LinkedList<Integer>(); intlist.add(new Integer(0)); Integer x = intlist.get(0); Ora non è possibile aggiungere una stringa ad intlist:list<integer> Le variabili di tipo rendono il codice parametrico più robusto e semplice da leggere e manutenere

Classi parametriche: uso Usare un tipo parametrico = istanziarlo per creare riferimenti e oggetti List<Integer> intlist = new LinkedList<Integer>(); tutte le occorrenze dei parametri formali sono rimpiazzate dall argomento (parametro attuale) Diversi usi generano tipi diversi Ma... classi parametriche compilate una sola volta danno luogo ad un unico file.class

Esempio: Pair<T,S> Una semplice classe parametrica per rappresentare coppie di oggetti public class Pair<T, S> public Pair(T firstelement, S secondelement) first = firstelement; second = secondelement; public T getfirst() return first; public S getsecond() return second; private T first; private S second; Continua

Esempio: Pair<T,S> Una semplice classe parametrica per rappresentare coppie di oggetti: Pair<String, BankAccount> result = new Pair<String, BankAccount> ("Harry Hacker", harryschecking); I metodi getfirst e getsecond restituiscono il primo e secondo elemento, con i tipi corrispondenti String name = result.getfirst(); BankAccount account = result.getsecond();

Variabili di tipo: convenzioni Variabile E K V T,S,U Significato Inteso Tipo degli elementi in una collezione Tipo delle chiavi in una mappa Tipo dei valori in una mappa Tipi generici

Esempio: LinkedList<E> public class LinkedList<E>... public E removefirst() if (first == null) throw new NoSuchElementException(); E element = first.data; first = first.next; return element;... private Node first; private class Node E data; Node next; Continua

Esempio: LinkedList<E> Notiamo la struttura della classe Node se la classe è interna, come nell esempio, non serve alcun accorgimento all interno di Node possiamo utilizzare il tipo E, il cui scope è tutta la classe se invece la classe è esterna, dobbiamo renderla generica

Esempio: LinkedList<E> class Node<F> F data; Node next; public class LinkedList<E>... public E removefirst() if (first == null) throw new NoSuchElementException(); E element = first.data; first = first.next; return element;... private Node<E> first; Continua

Generics e sottotipi I meccanismi di subtyping si estendono alle classi generiche class C<T> implements / extends D<T>... C<T> <: D<T> per qualunque T Analogamente: class C<T> implements / estends D... C<T> <: D per qualunque T Sembra tutto facile, MA...

Generics e sottotipi Consideriamo List<Integer> li = new ArrayList<Integer>(); List<Number> ln = li; La prima istruzione è legale, la seconda è più delicata Number è una classe che ha Integer, Double e altre classi wrapper come sottotipi Per capire se la seconda istruzione sia da accettare continuiamo con l esempio Continua

Generics e sottotipi List<Integer> li = new ArrayList<Integer>(); List<Object> lo = li; // type error lo.add( uh oh )); Integer i = li.get(0); // uh oh... Problema nella terza istruzione inseriamo un Double nella quarta estraiamo un Integer! Errore è nella seconda istruzione soluzione: errore di compilazione per l assegnamento Continua

Generics e sottotipi In generale: A B NON implica C<A> C<B> Quindi, ad esempio: Set<Integer> NON è sottotipo di Set<Object> Come dimostrato, vincoli necessari per la correttezza del principio di sostituibilità

Generics e sottotipi Limitazione sul subtyping con generics contro-intuitive uno degli aspetti più complessi dei generics Spesso anche troppo restrittive illustriamo con un esempio Continua

Generics e sottotipi Stampa gli elementi di una qualunque collection Primo tentativo static void printcollection(collection<object> els) for (Object e:els) System.out.println(e); els.add( pippo ); // ok Inutile: Collection<Object> non è il supertipo di Collection<T> per alcun T!= Object Continua

Wildcards Stampa degli elementi di una collezione Secondo tentativo static void printcollection(collection<?> els) for (Object e:els) System.out.println(e); els.add( pippo ); // ko Collection<?> è supertipo di qualunque Collection<T> Wildcard? indica un qualche tipo, non specificato Continua

Wildcards void printcollection(collection<?> els) for (Object e:els) System.out.println(e); Possiamo estrarre gli elementi di els al tipo Object Corretto perché, qualunque sia il loro vero tipo, sicuramente è sottotipo di Object Continua

Wildcards Però Collection<?> c = new ArrayList<String>(); c.add(new String()); // errore di compilazione! Poichè non sappiamo esattamente quale tipo indica?, non possiamo inserire elementi nella collezione In generale, non possiamo modificare valori che hanno tipo? Continua

Domanda Date un esempio di codice che causerebbe errore in esecuzione se permettessimo di aggiungere elementi a Collection<?>

Risposta Collection<Integer> ci = new ArrayList<Integer>; Colletion<?> c = ci; c.add( a string ); // non compila ci.get(0).intvalue(); L ultima istruzione invocherebbe intvalue() sul primo elemento di ci ma quell elemento ha tipo String Il compilatore previene l errore, rigettando la add()

Wilcards con vincoli (bounded) Shapes: (again!) interface Shape public void draw(graphics g); class Circle extends Shape private int x, y, radius; public void draw(graphics g)... class Rectangle extends Shape private int x, y, width, height; public void draw(graphics g)...

Wilcards con vincoli (bounded) Graphics e il metodo draw() public class Graphics // disegna una shape public void draw(shape s) s.draw(this); // disegna tutte le shapes di una lista public static void drawall(list<shape> shapes) for (Shape s:shapes) s.draw(this)... Solito problema: drawall() non può essere invocato su una List<Circle> Continua

Bounded Wilcards Quello che ci serve è un metodo che accetti liste di qualunque (sotto) tipo di Shape void drawall(list<? extends Shape> shapes)... List<? extends Shape> bounded wildcard indica un tipo sconosciuto, sottotipo di Shape il bound può essere qualunque tipo riferimento (classe o interfaccia) Ora il metodo ha la flessibilità necessaria e desiderata Continua

Bounded Wilcards Graphics e il metodo draw() public class Graphics // disegna una shape public void draw(shape s) s.draw(this); // disegna tutte le shapes di una lista public void drawall(list<? extends Shape> shapes) for (Shape s:shapes) s.draw(this)... Continua

Bounded Wilcards Attenzione: c è sempre un prezzo da pagare void addrectangle(list<? extends Shape> shapes) // errore di compilazione shapes.add(new Rectangle()); Non possiamo modificare strutture con questi tipi [ perché? ]