我有一个这样的列表:
private List<T> myList = new ArrayList<T>();
Run Code Online (Sandbox Code Playgroud)
我想得到T.的.class怎么能这样做?
我的意思是:
myList.getClass()
Run Code Online (Sandbox Code Playgroud)
编辑: 我试过:
Field genericField = Wrapper.class.getDeclaredField("myList");
ParameterizedType genericType = (ParameterizedType) genericField.getGenericType();
Class<?> genericClass = (Class<?>) genericType.getActualTypeArguments()[0];
Run Code Online (Sandbox Code Playgroud)
当我调试它
genericType
具有以下值:
java.util.List中
所以我认为这肯定是与该问题不同的问题:获取泛型类型的java.util.List,因为如果你声明一个类,T并在T稍后的另一个方法中分配一些东西,那么T持有的类就会消失.
Pet*_*nov 11
你不能因为类型擦除.泛型类型在运行时是未知的(它被'擦除'),它仅在编译时使用.
例如,这是java泛型和c#泛型之间的主要区别.
为什么你需要知道这个?也许这会满足你的需要
// must be at least one element (and all elements are the same)
Class elementType = myList.get(0).getClass();
Run Code Online (Sandbox Code Playgroud)
执行此操作的唯一方法是
喜欢
private final Class<T> type;
private final List<T> list = new ArrayList<T>();
public Class<T> getType() { return type; }
Run Code Online (Sandbox Code Playgroud)
喜欢
List list = new ArrayList<Integer>() { }; // create a specific sub-class
final Class<? extends List> listClass = list.getClass();
final ParameterizedType genericSuperclass = (ParameterizedType) listClass.getGenericSuperclass();
Class elementType = (Class) genericSuperclass.getActualTypeArguments()[0];
Run Code Online (Sandbox Code Playgroud)
这样做的缺点是您最终可能会创建大量匿名类,并且可能会与诸如此类的事情产生ArrayList.class != list.getClass()混淆list instanceof ArrayList