Modifiche recenti - Cerca:

Categorie

Pagine utente

Winzipedia

Uso dell'wiki

modifica il menu

UsoAvanzatoGenericsJava

Informatica3.UsoAvanzatoGenericsJava Versioni

Nascondi le modifiche minori - Mostra le modifiche

01/06/2006 ore 11:57 CEST di Vincenzo - Aggiunta di autore, collaboratori e sommario
Modificate le linee 7-9: da:
->[-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.-]
a:
->[-Esempio di uso dei generics con il controllo della gerarchia.-]
01/06/2006 ore 11:56 CEST di Vincenzo - Agg
Modificate le linee 1-2: da:
!! Mostrare l'uso dei generici con il controllo della gerarchia
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 Vincenzo - /* 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), 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:

Codice:
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.

Codice:
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.

Codice:
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:
}

Codice:
public
class Donna implements Datable {
a:
}

public class Donna implements Datable {
Modificate le linee 68-70: da:
}
a:
}
Modificate le linee 72-73: da:
Codice:
a:
Modificate le linee 93-99: da:
Codice:
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
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:
Codice:
Donna youngerWoman = CollectionUtils.getYounger(a, d);
a:

Donna youngerWoman = CollectionUtils.getYounger(a, d);
Cancellata la linea 105:
[Modifica Vinz]
Modificate le linee 108-118: da:
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("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 Andrea - /* 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.
Modifica - Versioni - Stampa - Modifiche recenti - Cerca
Ultima modifica il 01/06/2006 ore 11:57 CEST