Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - generics
Forum - Java - generics

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
killer (Normal User)
Expert


Messaggi: 217
Iscritto: 19/07/2009

Segnala al moderatore
Postato alle 20:02
Sabato, 20/11/2010
Questo topic è stato chiuso dal moderatore

salve a tutti ..ho letto un po su internet qalcosina riguardo le 'generics' in java.
ma non ho capito molto bene a cosa servono e soprattutto come creare delle classi aventi tale struttura.. !! ...attendo una vostra risposta :) grazie

PM
Avatar
crashoverride (Normal User)
Pro


Messaggi: 152
Iscritto: 09/07/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 20:12
Sabato, 20/11/2010
Io java lo stò imparando e ho studiato oggi i generics... Servono con le Collection Esempio Vector<String> = new Vector<String> Facendo in questo modo in questa Collection puoi mettere solo oggetti di tipo String.
Io ho capito in questo modo... Ma non prendere tutto per oro colato, arriverà qualcuno di più esperto! :)

PM
Avatar
bububs (Normal User)
Expert


Messaggi: 253
Iscritto: 11/03/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 20:46
Sabato, 20/11/2010
Permettono di specificare il tipo di un attributo. Se ad esempio ti servisse un array di interi che però abbia un "elasticità" dinamica, si potrebbe usare la classe Vector. Essa da sola, conterrà solo elementi di tipo Object. Mentre se hai la necessità di averlo di interi dovrai fare così:
Codice sorgente - presumibilmente Java

  1. Vector<Integer> array= new Vector<Integer>();

. Tra i simboli '<' e '>' puoi mettere il nome della classe del tipo di variabile, o addirittura una classe, così:
Codice sorgente - presumibilmente Java

  1. Vector<Nome_classe> array= new Vector<Nome_classe>();

. Spero di essere stato kiaro!! :)

PM
Avatar
paoloricciuti (Ex-Member)
Pro


Messaggi: 137
Iscritto: 27/04/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 2:06
Domenica, 21/11/2010
Beh molto più GENERICAMENTE (xD) i Generics servono per far prendere un parametro alla classe e su quello lavorare. Di norma vengono utilizzati per le Collection ma nulla toglie che potresti fare molto altro con i generics. Per poter creare una classe con generics devi dichiararla in questo modo:
Codice sorgente - presumibilmente Java

  1. public class NomeClass<T>{
  2. }


Di solito di usa la T tra le due parentesi angolate ma puoi metterci quello che vuoi. Successivamente in quella classe potrai utilizzare T come una qualunque classe, quindi creare variabili di tipo T e quant'altro. L'unica sfortuna è che non si può creare un array di T quindi se ti serve creare un array devi fartelo passare
come parametro della funzione in cui ti serve e popolare quello.

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
0
Down
V
Segnala al moderatore
Postato alle 10:22
Domenica, 21/11/2010
Se un tipo astrae una possibile gamma di valori, un generics astrae una possibile gamma di tipi. In particolare, puoi scrivere del codice che lavori con dei tipi T senza dichiarare apertamente quali essi siano, rendendo tutto più "generico", per l'appunto. Sarà poi il client, il codice che utilizza i tuoi metodi e le tue classi, a decidere su quale tipo essi debbano lavorare, esplicitandone uno tra parentesi angolari come mostrato dagli altri.

PM
Avatar
killer (Normal User)
Expert


Messaggi: 217
Iscritto: 19/07/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 12:04
Domenica, 21/11/2010
ma quali differenze ci sono tra il simbolo '?' e il 'T'   ? quando usare uno e quando usare l'altro...? e se volessi definire  2 o piu attributi generics per una classe ? E possibile farlo ? ad esempio:   Galassia<Terra,Marte,Giove> g  = new Galassia<..>();


PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
0
Down
V
Segnala al moderatore
Postato alle 18:37
Lunedì, 22/11/2010
Testo quotato

Postato originariamente da killer:

ma quali differenze ci sono tra il simbolo '?' e il 'T'   ? quando usare uno e quando usare l'altro...? e se volessi definire  2 o piu attributi generics per una classe ? E possibile farlo ? ad esempio:   Galassia<Terra,Marte,Giove> g  = new Galassia<..>();




Il tuo esempio con Galassia<Terra, Marte, Giove> mi fa pensare che tu non abbia capito, a meno che tu non consideri Terra, Marte e Giove delle classi, il che mi sembra improbabile, perché semmai la classe sarebbe Pianeta, mentre quei tre sarebbero istanze della classe. E' comunque possibile utilizzare un qualsiasi numero di tipi generics aperti nella dichiarazione di qualsiasi entità. Ad esempio:
Codice sorgente - presumibilmente Java

  1. public class Entry<Key, Value> {
  2.    //...
  3. }
  4.  
  5. Entry<String, Integer> a = new Entry<String, Integer>("uno", 1);
  6. Entry<DayOfYear, String> b = new Entry<DayOfYear, Person>(new DayOfYear(31, 12), "S. Silvestro");
  7. //...



Da quello che ho letto, penso che ? sia un carattere jolly usato per consentire la covarianza tra collezioni generics. Ad esempio, è lecito scrivere questo:
Codice sorgente - presumibilmente Java

  1. List<?> a = new List<String>();


poiché si assume che List<?> sia la superclasse di ogni altra classe List<T>, dove T è definito. Mentre non puoi scrivere questo:
Codice sorgente - presumibilmente Java

  1. List<Object> a = new List<String>();


poiché, sebbene Object sia superclasse di String, List<Object> NON è una superclasse di List<String>.

P.S.: dato che non conosco bene java, potrebbero esserci errori di sintassi nel codice...

PM
Avatar
killer (Normal User)
Expert


Messaggi: 217
Iscritto: 19/07/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 21:29
Lunedì, 22/11/2010
ok ...pero ad esempio  se come dici tu ..suppondendo di creare una classe  

public class Entry<Key,Value> {
            
             public Entry(){
            
             }        

}

nel costruttore cosa dovrei passare ? mmm forse non mi e chiaro ancora.. potresti farmi n'esempio concreto ?

tipo ho un ArrayList<Integer> array=new .......; oppure un ArrayList<MyClass> array1= new .......  
per inserire gli elementi con  array.add()<--------//ho notato che specificando l'array con minore e maggiore in base alle mie esigenze, il metodo add  fa in modo di aggiungermi solo elementi di quella classe specificata non accettando altri tipi..ma come fa a fare tutto questo ?  hanno dichiarato il metodo add nello stesso modo di come e stata dichiarata la classe ? ossia tipo public void add<T> etc... !?! questo non lo capisco affatto .. :) se potresti essere piu chiaro a riguardo ti ringrazierei molto..

PM
Avatar
paoloricciuti (Ex-Member)
Pro


Messaggi: 137
Iscritto: 27/04/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 0:33
Martedì, 23/11/2010
Testo quotato

Postato originariamente da killer:

ok ...pero ad esempio  se come dici tu ..suppondendo di creare una classe  

public class Entry<Key,Value> {
            
             public Entry(){
            
             }        

}

nel costruttore cosa dovrei passare ? mmm forse non mi e chiaro ancora.. potresti farmi n'esempio concreto ?

tipo ho un ArrayList<Integer> array=new .......; oppure un ArrayList<MyClass> array1= new .......  
per inserire gli elementi con  array.add()<--------//ho notato che specificando l'array con minore e maggiore in base alle mie esigenze, il metodo add  fa in modo di aggiungermi solo elementi di quella classe specificata non accettando altri tipi..ma come fa a fare tutto questo ?  hanno dichiarato il metodo add nello stesso modo di come e stata dichiarata la classe ? ossia tipo public void add<T> etc... !?! questo non lo capisco affatto .. :) se potresti essere piu chiaro a riguardo ti ringrazierei molto..  


Quando inizializzi una nuova istanza di una classe con generics non hai altro che da fare che ArrayList<Integer> a=new ArrayList<Integer>();

Per quanto riguarda il metodo add, la classe ArrayList è fatta più o meno così:
Codice sorgente - presumibilmente Java

  1. public class ArrayList<T>{
  2.  
  3.     public void add(T element){
  4.  
  5.     }
  6.  
  7.     public T get(int i){
  8.  
  9.     }
  10.  
  11. }



Come puoi vedere la classe usa T come una qualsiasi classe, dunque se ustanzierai una arraylist di Integer accetterà solo Integer e ritornerà solo Integer.

Ultima modifica effettuata da paoloricciuti il 23/11/2010 alle 0:34
PM
Pagine: [ 1 2 ] Precedente | Prossimo