Możesz to zrobić, używając Java Reflection. Nie wiem, czy to zawsze dobry pomysł, ale na pewno jest to możliwe. Oto przykład:
public class Test{
private List<String> list;
public static void main(String[] args) throws Exception{
Field field = Test.class.getDeclaredField("list");
Field f = field.getGenericType().getClass().getDeclaredField("actualTypeArguments");
f.setAccessible(true);
Type[] genericTypes = (Type[]) f.get(field.getGenericType());
System.out.println(genericTypes[0]);
}
}
Albo można oddać bezpośrednio do ParameterizedType, jeśli wydaje się lepiej do ciebie:
public class Test{
private List<String> list;
public static void main(String[] args) throws Exception{
Field field = Test.class.getDeclaredField("list");
ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType();
Type[] actualTypes = parameterizedType.getActualTypeArguments();
System.out.println(actualTypes[0]);
}
}
Zarówno druk przykłady: class java.lang.String
Teraz wystarczy opuścić pełniejsze odpowiedź, to samo można zrobić dla mapy Mapa. Jak widać metoda getActualTypeArguments()
zwraca Type[]
i przez mapą, klucz typu byłby indeks 0, a typ wartość byłaby indeks 1. Przykład:
public class Test{
private Map<String, Integer> map;
public static void main(String[] args) throws Exception{
Field mapField = Test.class.getDeclaredField("map");
ParameterizedType mapParameterizedType = (ParameterizedType) mapField.getGenericType();
Type[] actualMapTypes = mapParameterizedType.getActualTypeArguments();
System.out.println(actualMapTypes[0]);
System.out.println(actualMapTypes[1]);
}
}
Wydruki:
class java.lang.String
class java.lang.Integer
Prawdopodobnie musisz zrobić coś takiego jak 'publishMessage (genericMessage, Integer.class);' – assylias