Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
20/11/10 19:02
killer
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
aaa
20/11/10 19:12
crashoverride
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! :)
aaa
20/11/10 19:46
bububs
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ì:
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ì:
Vector<Nome_classe> array= new Vector<Nome_classe>();
. Spero di essere stato kiaro!! :)
aaa
21/11/10 1:06
paoloricciuti
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:
public class NomeClass<T>{
}

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.
aaa
21/11/10 9:22
Il Totem
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.
aaa
21/11/10 11:04
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<..>();

aaa
22/11/10 17:37
Il Totem
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:
public class Entry<Key, Value> {
   //...
}

Entry<String, Integer> a = new Entry<String, Integer>("uno", 1);
Entry<DayOfYear, String> b = new Entry<DayOfYear, Person>(new DayOfYear(31, 12), "S. Silvestro");
//...


Da quello che ho letto, penso che ? sia un carattere jolly usato per consentire la covarianza tra collezioni generics. Ad esempio, è lecito scrivere questo:
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:
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...
aaa
22/11/10 20:29
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..
aaa