Получение типа Коллекции - PullRequest
2 голосов
/ 27 марта 2010

Итак, у меня есть что-то вроде следующего в Java:

private List<SomeType>variable;

// ....variable is instantiated as so ...
variable = new ArrayList<SomeType>();

// there's also a getter
public List<SomeType> getVariable() { /* code */ }

То, что я хотел бы сделать, это выяснить, что variable - это коллекция SomeType программно. Я прочитал здесь , что я могу определить это по методу getVariable(), но есть ли способ отличить напрямую от variable?

Мне удалось получить SomeType из метода получения, основываясь на информации в ссылке. Мне также удалось получить все поля окружающего класса через SurroundingClass.getClass().getDeclaredFields(), но это не говорит мне, что это List<SomeType>.

РЕДАКТИРОВАТЬ: Основываясь на ответе bmargulies, выполнение следующих действий приведет к тому, что я хочу:

Field[] fields = SurroundingClass.getDeclaredFields();
/* assuming it is in fields[0] and is a ParameterizedType */
ParameterizedType pt = (ParameterizedType) fields[0].getGenericType(); 
Type[] types = pt.getActualTypeArguments();
/* from types I'm able to see the information I've been looking for */

Ответы [ 2 ]

7 голосов
/ 27 марта 2010

Вы не можете получить это из экземпляра из-за стирания типа. Во время выполнения XXX<T> на самом деле просто XXX. Если класс не примет специальных мер для хранения ссылки на класс для T, он полностью и полностью исчезнет.

Вы можете получить его из getDeclaredFields (). Вы должны вызвать getGenericType для поля, а не getType, а затем вам нужно выполнить приведение к ParameterizedType, а затем запросить у него нужный параметр.

1 голос
/ 27 марта 2010

Вы можете получить SomeType, посмотрев на один из элементов в Коллекции

Collection<String> abc = new ArrayList<String>();
for ( Object x : abc ) { String className = x.getClass().getName(); break; }
...