Categorie
Winzipedia Uso dell'wiki |
UsoAvanzatoGenericsJavaInformatica3.UsoAvanzatoGenericsJava VersioniMostra le modifiche minori - Mostra le modifiche 01/06/2006 ore 11:57 CEST
di - Aggiunta di autore, collaboratori e sommario
Modificate le linee 7-9: da:
->[- a:
->[-Esempio di uso dei generics con il controllo della gerarchia.-] 01/06/2006 ore 11:56 CEST
di - Agg
Modificate le linee 1-2: da:
! a:
! Mostrare l'uso dei generici con il controllo della gerarchia '''Autore:''' [[Profiles.Andrea|Andrea Rota]]\\ '''Hanno contribuito:''' [[Profiles.Vincenzo|Vincenzo Manzoni]] ->'''Sommario''' ->[-Questa pagina un riassunto del capitolo 2 del libro consigliato dal docente e tratta dell' di scrivere algoritmi che risolvano alcune classi di problemi. Sono riassunti i contenuti dei pdf ''touringm.pdf'' e ''.pdf'' disponibili sul sito del corso.-] 07/05/2006 ore 15:24 CEST
di - /* Sistemazione della formattazione */
Modificate le linee 1-7: da:
Mostrare l'uso dei generici con il controllo della gerarchia Per questo esempio, una classe, CollectionUtils, che permette di svolgere operazioni su oggetti. In particolare il metodo getYounger(a, b), Per stabilire chi giovane operare un confronto sulla data dell'oggetto, e quindi l'oggetto essere public interface Datable { a:
!! Mostrare l'uso dei generici con il controllo della gerarchia Per questo esempio, una classe, @@CollectionUtils@@, che permette di svolgere operazioni su oggetti. In particolare il metodo @@getYounger(a, b)@@ che, dati due oggetti dello stesso tipo, ritorna il giovane. Per stabilire chi giovane operare un confronto sulla data dell'oggetto, e quindi l'oggetto essere ''databile''. Per fare ho usato un'interfaccia: public interface Datable { Modificate le linee 9-14: da:
} Tutti gli oggetti databili devono restituire un intero che rappresenta l'anno di creazione. Sulla base di questa considerazione, posso scrivere il metodo getYounger. public class CollectionUtils { a:
} Tutti gli oggetti databili devono restituire un intero che rappresenta l'anno di creazione. Sulla base di questa considerazione, posso scrivere il metodo @@getYounger@@. public class CollectionUtils { Modificate le linee 22-31: da:
} Notare che se invece di <T extends Datable> avessi messo solo <T>, il compilatore avrebbe dato errore sull'invocazione di getYear, in quanto non certo che il tipo T abbia questo metodo. Possiamo leggere quindi che getYounger prende due oggetti, di qualsiasi tipo databile. Altra nota sulla notazione: extends vale sia per classi che per interfacce. Testiamo ora il codice: creo due classi, Disco e Donna, che risultano databili. public class Disco implements Datable { a:
} Notare che se invece di @@<T extends Datable>@@ avessi messo solo @@<T>@@, il compilatore avrebbe dato errore sull'invocazione di @@getYear@@, in quanto non certo che il tipo @@T@@ abbia questo metodo. Possiamo leggere quindi che @@getYounger@@ prende due oggetti, di qualsiasi tipo databile. Altra nota sulla notazione: ''extends'' vale sia per classi che per interfacce. Testiamo ora il codice: creo due classi, ''Disco'' e ''Donna'', che risultano databili. public class Disco implements Datable { Modificate le linee 48-52: da:
} public a:
} public class Donna implements Datable { Modificate le linee 68-70: da:
} a:
} Modificate le linee 72-73: da:
a:
Modificate le linee 93-99: da:
Chi Let's talk about love di Celine Dion, 1997 Chi fra Rita Levi Montalcini nata nel 1909 e Stefania Ronchi nata nel 1983 giovane? Stefania Ronchi nata nel 1983 a:
Chi fra Let's talk about love di Celine Dion, 1997 e Yellow Submarine di The Beatles, 1968 giovane? Let's talk about love di Celine Dion, 1997 Chi fra Rita Levi Montalcini nata nel 1909 e Stefania Ronchi nata nel 1983 giovane? Stefania Ronchi nata nel 1983 Modificate le linee 101-103: da:
Donna youngerWoman = CollectionUtils.getYounger(a, d); a:
Donna youngerWoman = CollectionUtils.getYounger(a, d); Cancellata la linea 105:
Modificate le linee 108-118: da:
Per risolvere il problema e confrontare anche donne e dischi Object Se invece fossi stato interessato solo alla stampa, sarebbe stato suffciente passare il valore ritornato direttamente alla System.out.println, la quale avrebbe semplicemente chiamato il metodo toString() della classe ritornata, donna o disco che sia. System.out.println("Chi fra " + a + " e " + d + " giovane?"); System.out.println(CollectionUtils.getYounger(a, d)); [/Modifica Vinz] a:
Per risolvere il problema e confrontare anche donne e dischi ci sono due soluzioni: se sono interessato ad avere un riferimento all'oggetto posso salvarlo in una classe padre comune alle due (supertipo), nel nostro caso @@Object@@. Object youngerObject = CollectionUtils.getYounger(a, d); Se invece fossi stato interessato solo alla stampa, sarebbe stato suffciente passare il valore ritornato direttamente alla @@System.out.println@@, la quale avrebbe semplicemente chiamato il metodo @@toString()@@ della classe ritornata, donna o disco che sia. System.out.println("Chi fra " + a + " e " + d + " giovane?"); System.out.println(CollectionUtils.getYounger(a, d)); 07/05/2006 ore 15:17 CEST
di - /* Creazione della pagina */
Aggiunte le linee 1-125:
Mostrare l'uso dei generici con il controllo della gerarchia Codice: public interface Datable { public int getYear(); } Codice: public class CollectionUtils { public static <T extends Datable> T getYounger(T a, T b) { if (a.getYear() > b.getYear()) { return a; } else { return b; } } } Testiamo ora il codice: creo due classi, Disco e Donna, che risultano databili. Codice: public class Disco implements Datable { private String titolo, artista; private int anno; public Disco(String titolo, String artista, int anno) { this.titolo=titolo; this.artista=artista; this.anno=anno; } public String toString(){ return titolo + " di " + artista + ", " + anno; } public int getYear(){ return anno; } } Codice: public class Donna implements Datable { private String nome; private int anno; public Donna(String nome, int anno) { this.nome=nome; this.anno=anno; } public String toString(){ return nome + " nata nel " + anno; } public int getYear(){ return anno; } } E prepariamo due esempi: un confronto fra dischi e uno fra donne. Codice: public static void main(String[] args) { Disco a = new Disco("Let's talk about love", "Celine Dion", 1997); Disco b = new Disco("Yellow Submarine", "The Beatles", 1968); Donna c = new Donna("Rita Levi Montalcini", 1909); Donna d = new Donna("Stefania Ronchi", 1983); Disco youngerLp = CollectionUtils.getYounger(a, b); System.out.println(youngerLp); Donna youngerWoman = CollectionUtils.getYounger(c, d); System.out.println(youngerWoman); } Ecco il risultato: Codice: Let's talk about love di Celine Dion, 1997 Stefania Ronchi nata nel 1983 Se avessi cercato di fare: Codice: Donna youngerWoman = CollectionUtils.getYounger(a, d); [Modifica Vinz] Per risolvere il problema e confrontare anche donne e dischi Wink ci sono due soluzioni: se sono interessato ad avere un riferimento all'oggetto posso salvarlo in una classe padre comune alle due (supertipo), nel nostro caso Object. Codice: Object youngerObject = CollectionUtils.getYounger(a, d); Se invece fossi stato interessato solo alla stampa, sarebbe stato suffciente passare il valore ritornato direttamente alla System.out.println, la quale avrebbe semplicemente chiamato il metodo toString() della classe ritornata, donna o disco che sia. Codice: System.out.println(CollectionUtils.getYounger(a, d)); [/Modifica Vinz] Morale della favola: i generici non solo aiutano a scrivere meno codice, ma anche a garantire la type-safety, anche con l'uso di vincoli sui tipi. |