如何获取列表包含的元素类?

kam*_*aci 7 java class list

我有一个这样的列表:

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#泛型之间的主要区别.

  • +1,因为如果所述类型为"List <T>",它是正确的. (6认同)

Pet*_*rey 8

为什么你需要知道这个?也许这会满足你的需要

// must be at least one element (and all elements are the same)
Class elementType = myList.get(0).getClass(); 
Run Code Online (Sandbox Code Playgroud)

执行此操作的唯一方法是

  • 将类型存储在字段中并为此添加一个 getter 方法。

喜欢

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)
  • 在实际字段上使用 getGenericType() ,假设参数类型不是泛型。
  • 使用具有特定类型的子类。

喜欢

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