Type erasure означает, что информация об общем типе объекта просто отсутствует во время выполнения.
(ссылка на соответствующий раздел Java Generics FAQ Анжелики Лангера, который должен ответить практически на любой вопрос вы могли бы спросить о Java дженериков :)
Однако, вы на самом деле не заинтересованы в типе объекта - вас интересует тип поля . Я неправильно понял вопрос, и хотя ответ был принят, я надеюсь внести исправления, исправив его сейчас :)
Если поле не использует параметр типа, оно может быть выполнено. Например:
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);
}
}
}
Если поле было в классе T
с полем быть List<T>
то вы должны были бы знать аргумент типа для этого экземпляра, чтобы знать тип аргумента для коллекции.
Перевод этого кода в ваш требуемый код несколько сложнее - вам действительно нужно знать аргумент типа в точке класса коллекции. Например, если кто-то заявил:
public class StringCollection implements Collection<String>
, а затем имел поле типа StringCollection
, что поле само по себе не будет иметь каких-либо аргументов типа. Затем вам нужно будет проверить getGenericSuperType
и getGenericInterfaces
рекурсивно, пока вы не найдете то, что хотите.
Это действительно нелегко сделать, хотя это возможно. Если бы я был вами, я бы попытался изменить ваш дизайн, чтобы вам это не понадобилось.
Я столкнулся с подобной проблемой, и это то, что окончательно разрешило это для меня: http://stackoverflow.com/a/183232/639119 – Zds