Type erasure significa che le informazioni sul tipo generico di un oggetto non sono presenti al momento dell'esecuzione.
(Il link è alla relativa sezione del Java Generics FAQ di Angelika Langer, che dovrebbe rispondere a praticamente ogni domanda si potrebbe chiedere generici Java :)
Tuttavia, non siete realmente interessati nel tipo di un oggetto - ti interessa il tipo di un campo . Ho letto male la domanda e, sebbene la risposta sia stata accettata, spero di rimediare risolvendolo ora :)
Se il campo non utilizza un parametro di tipo, è possibile farlo. Per esempio:
import java.lang.reflect.*;
import java.util.*;
public class Test
{
public List<String> names;
public static void main(String [] args)
throws Exception // Just for simplicity!
{
Field field = Test.class.getDeclaredField("names");
ParameterizedType type = (ParameterizedType) field.getGenericType();
// List
System.out.println(type.getRawType());
// Just String in this case
for (Type typeArgument : type.getActualTypeArguments())
{
System.out.println(" " + typeArgument);
}
}
}
Se il campo fosse in una classe T
con il campo essendo List<T>
allora dovreste conoscere l'argomento di tipo per l'istanza al fine di conoscere l'argomento tipo per la raccolta.
Traducendo questo nel tuo codice necessario è un po 'difficile anche se - si ha realmente bisogno di sapere l'argomento di tipo presso il punto di raccolta della classe. Per esempio, se qualcuno ha dichiarato:
public class StringCollection implements Collection<String>
e poi ha avuto un campo di tipo StringCollection
, che campo stesso non avrebbe alcuna argomenti di tipo. Farebbe quindi necessario controllare getGenericSuperType
e getGenericInterfaces
ricorsivamente fino hai trovato quello che volevi.
E 'davvero non sarà facile per farlo, anche se è possibile. Se fossi in te, proverei a cambiare il tuo design in modo da non averne bisogno.
fonte
2009-07-14 20:46:57
Io stavo affrontando un problema simile e questo è quello che finalmente lo risolse per me: http://stackoverflow.com/a/183232/639119 – Zds