Segui skydiamond.org anche su Twitter
 
: [1]
Generics
Generics
« : January 08, 2008, 06:25:28 pm »

Qualcuno di voi ha mai programmato coi Generics? Ho visto che sono utili nelle collezioni come le Liste per non effettuare casting di continuo. Mi sapreste dire se ci sono utilizzi più avanzati?

A riguardo ho trovato questo:

Code: (java) [Select]
List<String>stringhe = new ArrayList<String>();
stringhe.add("Pippo");
stringhe.add("Pluto");
String x = stringhe.iterator().next();

Non bisogna più andare a "castare" con (String) il dato da addare. Anzi questo dovrebbe sollevare un'eccezione:
Code: (java) [Select]
stringhe.add(new Integer(5))
Il problema dovrebbe essere relativo anche al casting sull'estrazione. In pratica prima dei Generics si andava ad inserire degli Object nelle collezioni e quando si estraeva si doveva effettuare comunque il casting per riavere l'oggetto voluto e non trovarsi per le mani gli Object.
Il problema nasce proprio se si fa un errore nell'inserimento, mettendo un oggetto di tipo diverso nella collezione.

Code: (java) [Select]
Vector v = new Vector();
v.add(new MioOggetto());
...
/* Lo rivoglio indietro e da bravo maghetto devo castare */
MioOggetto x = (MioOggetto)v.get(0);

/* Ho appena aggiunto in coda al vettore un MioOggetto, ma se avessi inserito uno String? */
v.add(new String(”asdasd”));
Al casting avrò sicuramente un'eccezione.





P.S.
Sono febbricitante e mi sa che forse comprenderò tutto meglio a mente lucida...  :icold:
  • Lebby
  • developer
  • *
  • Offline Offline
  • : 258
  • Venite a me ... il lato oscuro vi aspetta
  •  
Re: Generics
« #1 : January 08, 2008, 07:02:33 pm »

Non sapevo che si chiamassero generics .. comunque se e' quello che dico io ... usa la prima e fondamentale proprieta' del linguaggio java: sono tutti figli di object. Infatti quei metodi hanno come parametro di ingresso sempre e solo object.
In java si puo' fare molto di piu' usando la reflection ...
Re: Generics
« #2 : January 08, 2008, 07:14:44 pm »

Non sapevo che si chiamassero generics .. comunque se e' quello che dico io ... usa la prima e fondamentale proprieta' del linguaggio java: sono tutti figli di object. Infatti quei metodi hanno come parametro di ingresso sempre e solo object.
In java si puo' fare molto di piu' usando la reflection ...
Il problema era proprio che erano tutti object. I generics nascono per indicare alla VM di tipizzare i dati in ingresso e uscita alle collection e altre cose che non ho ben compreso mi sa. Non ci sono molto con la testa al momento (vedi avatar).  :tired:

Ho letto qualcosa sulla reflection con .NET e il CommonType Definition ma non ricordo della riflessione in JAVA.  :hum: Mi daresti i dettagli?
  • Lebby
  • developer
  • *
  • Offline Offline
  • : 258
  • Venite a me ... il lato oscuro vi aspetta
  •  
Re: Generics
« #3 : January 09, 2008, 12:40:30 am »

java.util.reflec mi pare ....
Comunque in parole povere e spicciole con la reflection e' possibile creare classi in runtime, prendere la lista dei metodi, i relativi parametri di ingresso e uscita, i costruttori etc... Insomma puoi effettuare le normali operazioni di dichiarazione, istanziamento e denominazione in runtime, usare il classloader, caricare librerie o classi runtime  ... insomma belle cose ...
I contro sono una non ottimizzazione a livello di esecuzione ... ovvero il programma gira piu' lento ...

Per quanto riguarda quello che chiami generics ... il concetto e' molto semplice ... se io metto come parametri object ... essendo qualsiasi classe ( e non interfaccia ... ATTENZIONE ) figlia di object ... posso mettere qualsiasi cosa.
Esempio pratico ... Un array di Object puo' esser un array eterogeneo o omogeneo di qualsiasi cosa.
Questa e' una delle cose che credo derivino dallo studio dei pattern per quanto riguarda uno dei principi fondamentali di esso ... ovvero l'incapsulamento. Quasi tutti i pattern che ho visto dichiarano sempre una superclasse astratta ... o una interfaccia con livello massimo ... il motivo e' semplicissimo ... Io con questo metodo sotto posso avere qualsiasi cosa che rispetti i minimi vincoli ... POTENTISSIMO.

( io non ho capito i pattern ... ma ho capito le loro caratteristiche basilari ... speriamo che un giorno li impari ... perche' OGGI sono fondamentali per uno sviluppo rapido e STANDARDIZZATO )

E' la stessa cosa dei puntatori void del c++/c.
Se avevi un puntatore void ... esso puo' essere un puntatore a interi, come un puntatore a struct, o a classi o ... ( cosa fenomenale ) a funzioni ... I puntatori che si usano con la pthread per esempio erano puntatori void ... Un puntatore void puo' puntare a qualsiasi cosa ... poi sta a te castarla in maniera appropriata. void * .... = new AllWorld() ;)
  • Aldo
  • user
  • *
  • Offline Offline
  • : 80
  •  
Re: Generics
« #4 : January 11, 2008, 02:00:42 pm »

Lebby che hai contro i Generics? Io li trovo molto utili a dire il vero...  non hanno a che fare con la reflection, sono semplicemente un sistema in più per usare il polimorfismo e proteggere il programmatore dal compiere errori.

Infatti sky tu parlavi delle classi "collection" in java (ma è così anche per .NET o per la Standard Template Library di C++), che sono il caso più semplice di utilizzo. Infatti forzando la dichiarazione del tipo di una lista non solo si evitano i casting  (cosa che già di per se è ottima), ma a compile time puoi già ottenere degli errori nel caso in cui stessi sbagliando inserimenti ed estrazioni dalle collection.

E' possibile inoltre usare il meccanismo in questione per parametrizzare anche le proprie classi (in C++ la parola chiave è "template", ma credo sia la stessa anche in java e .NET), imporre che il tipo utilizzato sia parte di una determinata gerarchia (ad esempio dichiarando una classe parametrizzata in maniera da poterla usare con tutti i tipi figli di un'interfaccia specifica X) o, in C++ sicuramente ma non so negli altri linguaggi, usare il template per specificare dei parametri alla classe.

Importante è notare che i Generics, contrariamente al "protocollo Object", vengono risolti per lo più a compile time, quindi dovrebbero esser più efficienti.

Astrac - www.astrac.org
Re: Generics
« #5 : January 11, 2008, 05:48:33 pm »

E' possibile inoltre usare il meccanismo in questione per parametrizzare anche le proprie classi (in C++ la parola chiave è "template", ma credo sia la stessa anche in java e .NET), imporre che il tipo utilizzato sia parte di una determinata gerarchia (ad esempio dichiarando una classe parametrizzata in maniera da poterla usare con tutti i tipi figli di un'interfaccia specifica X) o, in C++ sicuramente ma non so negli altri linguaggi, usare il template per specificare dei parametri alla classe.

Importante è notare che i Generics, contrariamente al "protocollo Object", vengono risolti per lo più a compile time, quindi dovrebbero esser più efficienti.
Mi hai fatto riaffiorare alla mente il buon caro Eckel che parlava già (1.4 di JAVA) dei generics come passo in avanti per raggiungere i template di C++. Ora ricordo. :)
Comunque il discorso per ereditarietà e classi coi generics non so se si possa fare. Devo approfondire quando e se avrò tempo.
  • Lebby
  • developer
  • *
  • Offline Offline
  • : 258
  • Venite a me ... il lato oscuro vi aspetta
  •  
Re: Generics
« #6 : January 11, 2008, 06:57:45 pm »

Non ho nulla contro i generics anzi ... sono magnifici ... e la reflection lo so' che e' una cosa diversa ... solo che la descrivevo solo perke' Sky mi aveva domandato di introdurla e l'ho fatto ...
Poi ... Tutta la programmazione a generics in c++ e' semplice ... si possono bypassare facilmente i Template facendo una classe nostra Object e da li' dare sfogo all'ereditarieta' semplice e multipla ... L'unica cosa e' forse un maggiore sforzo da parte del programmatore che non e' tantissimo, ma c'e'!!

Cmq Bella discussione ... quando si parla di programmazione astratta si suscitano in me strane e appaganti sensazioni !!!!
  • Aldo
  • user
  • *
  • Offline Offline
  • : 80
  •  
Re: Generics
« #7 : January 11, 2008, 08:20:22 pm »

E' possibile inoltre usare il meccanismo in questione per parametrizzare anche le proprie classi (in C++ la parola chiave è "template", ma credo sia la stessa anche in java e .NET), imporre che il tipo utilizzato sia parte di una determinata gerarchia (ad esempio dichiarando una classe parametrizzata in maniera da poterla usare con tutti i tipi figli di un'interfaccia specifica X) o, in C++ sicuramente ma non so negli altri linguaggi, usare il template per specificare dei parametri alla classe.

Importante è notare che i Generics, contrariamente al "protocollo Object", vengono risolti per lo più a compile time, quindi dovrebbero esser più efficienti.
Mi hai fatto riaffiorare alla mente il buon caro Eckel che parlava già (1.4 di JAVA) dei generics come passo in avanti per raggiungere i template di C++. Ora ricordo. :)
Comunque il discorso per ereditarietà e classi coi generics non so se si possa fare. Devo approfondire quando e se avrò tempo.

Il discorso dell'ereditarietà si può fare sicuramente in C++ e .NET, onestamente non sono sicurissimo del java.

Astrac - www.astrac.org
: [1]
: