Стирание типа означает, что информация об универсальном типе объекта просто отсутствует во время выполнения.
(Ссылка на соответствующий раздел часто задаваемых вопросов по Java Generics * от Angelika Langer , который должен ответить практически на каждый вопрос, который вы можете задать о дженериках 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
рекурсивно, пока вы не найдете то, что хотели.
Это действительно не будет легко сделать, даже если это возможно. Если бы я был тобой, я бы попытался изменить твой дизайн, чтобы он тебе не понадобился.