Se tuo Map
è un campo dichiarato, è possibile effettuare le seguenti operazioni:
import java.lang.reflect.*;
import java.util.*;
public class Generic {
private Map<String, Number> map = new HashMap<String, Number>();
public static void main(String[] args) {
try {
ParameterizedType pt = (ParameterizedType)Generic.class.getDeclaredField("map").getGenericType();
for(Type type : pt.getActualTypeArguments()) {
System.out.println(type.toString());
}
} catch(NoSuchFieldException e) {
e.printStackTrace();
}
}
}
Il codice qui sopra stampare:
class java.lang.String
class java.lang.Number
Tuttavia, se si dispone semplicemente di un'istanza di Map
, ad es. se fosse passato a un metodo, non è possibile ottenere le informazioni in quel momento:
public static void getType(Map<String, Number> erased) {
// cannot get the generic type information directly off the "erased" parameter here
}
È potrebbe afferrare la firma del metodo (ancora una volta, utilizzando la riflessione come il mio esempio di cui sopra) per determinare il tipo di erased
, ma in realtà non ti porta da nessuna parte (vedi modifica sotto).
Edit:
commenti di BalusC sottostanti devono essere notato. Non dovresti davvero aver bisogno di farlo; è già dichiarato il tipo di mappa, quindi non si ottiene più informazioni di quelle già in possesso. Vedi il suo answer here.
fonte
2010-09-10 19:51:57
Vedere questo: http://stackoverflow.com/questions/1942644/get-generic-type-of-java-util-list –
È possibile utilizzare [Reflection] (http://download.oracle.com/javase /tutorial/reflect/index.html) – Aillyn
Qual è il requisito funzionale? Ci possono essere soluzioni migliori di quelle con la riflessione. – BalusC