Newsgroup: it.comp.java
Titolo: Problema avanzato coi generics

Salve a tutto il gruppo,
ho girato tutto internet e non sono riuscito a trovare nulla che potesse 
aiutarmi, quindi spero in un vostro aiuto.
Il mio problema è il seguente: ho bisogno di sapere la classe degli 
elementi di una collezione. Sembra banale, ma non lo è purtroppo... in 
pratica vorrei fare:
private <ItemType> void generateCollection (Collection<ItemType> 
collection) {
	this.doSomethingWithClass(ItemType.class);
}
il compilatore mi esce con l'errore "illegal class literal for the type 
parameter ItemType". Ora questa soluzione che ho scritto è quella più 
facile che mi viene in mente, ma ne ho provate a vagonate, e ho visto 
diversi tutorial, ma non riesco a tirare fuori la classe ItemType.
Per spiegarmi meglio, idealmente, passando a questo metodo una 
collezione di stringhe Collection<String>, io vorrei capire a runtime 
che quelle sono stringhe tramite la sostituzione dinamica del generic 
ItemType con String.
Suggerimenti?
Grazie mille per l'aiuto,
Caesar (CaesarOd...@Fastwebnet.It)

 Caesar (CaesarOdiaLoS...@Fastwebnet.It)
Non ho usato i generics massivamente, ma sto leggendo un libro.
In java è implementato per erasure, cioè le info sui generics non
arrivano sul bytecode.
Per cui non puoi fare .class di un tipo generico.
Una possibile soluzione è estrarre un elemento, e fare .getClass() di
quello.

 Suggerimenti?
Ciao Caesar (anzi Ave Caesar :)),
dentro Ammentos per dedurre il tipo parametrico attuale di liste e mappe 
utilizzo la reflection, sfruttando i metodi di questa classe:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/ParameterizedType.html
Così su due piedi non saprei dirti se la soluzione sia applicabile anche 
al tuo caso, in ogni caso spero di averti dato un suggerimento utile.
Ciao
pole
-- 
ammentos - a lightweight persistence framework for JDK5
http://ammentos.biobytes.it
Flash tutorial: 
http://ammentos.biobytes.it/quickstart/quickstart.html

fabio.b...@gmail.com
 ha scritto:

Purtroppo la collezione è vuota, e devo generare io dei valori da 
inserirvi, quindi nn posso :(
-- 
Ave!
Caesar.
Eatvr quo nos deorvm ostenta vocant. Alea iacta est!
Caivs Ivlivs Caesar, Imperator Mvndi
CaesarOd...@Fastwebnet.It

 al tuo caso, in ogni caso spero di averti dato un suggerimento utile.
Ed abbiamo la soluzione siore e siori!!! :D
Grazie infinite, è proprio quello che stavo cercando... purtroppo per 
certe cose le ricerche su web nn servono, l'unica giusta è tra migliaia 
di risultati inutili... w w i ng direi ;)
Per chi è interessato e per chi in futuro avrà lo stesso problema, metto 
un esempio di soluzione (tra l'altro ho anche spulciato il codice del 
tuo ammentos x vedere se avevo capito giusto)
/* sappiamo che il campo "collezione" della classe Classe è una
Collection<Qualcosa>, vogliamo sapere che classe è "Qualcosa" :) */
public class Classe {
	public Collection<String> collezione;
}
import java.lang.reflect.ParameterizedType;
public class Analizzatore {
public static void main (String[] args) {
	try {
		ParameterizedType pt = (ParameterizedType)
			Classe.class.getField("collezione")
					.getGenericType();
		System.out.println(pt.getActualTypeArguments()[0]);
	}catch(Exception e){}
}
Quello che viene visualizzato è proprio String ;)
La cosa ottima (e che serviva a me) è che il getActualTypeArguments() 
restituisce un vettore di Type, da cui si può estrarre un oggetto Class 
per farci ciò che si vuole ;)
Grazie ancora x l'aiuto pole ;)
