获取类集合上元素的类型信息

Chr*_*row 0 java generics reflection

我想获得对Collection中保存的Object类型的访问权限.下面是我可能想要这样做的时间和原因的简化示例.这甚至可能吗?

List<Address> addressList = new LinkedList<Address>();

Main.addElement(addressList);

Class Main{
   public void addElement(Object inArgument){
      List<Object> argument = (List<Object>)inArgument;
      argument.add( /* WOULD LIKE TO CREATE A NEW OBJECT OF THE APPROPRIATE TYPE
                       HERE, IN THIS CASE, IT WOULD BE OF TYPE: "Address" */ );
   }
}
Run Code Online (Sandbox Code Playgroud)

eri*_*son 5

不,你不能用Java的泛型的当前实现来做到这一点.类型参数在编译时被"擦除".

您可以通过反射确定方法参数和返回类型以及成员变量的类型参数信息,但在这种情况下无效.

作为一种实用的解决方法,大多数想要执行类似操作的API都将Class实例作为第二个参数.例如:

public void addElement(Collection<T> c, Class<? extends T> clz) 
  throws Exception
{
  Constructor<? extends T> ctor = clz.getConstructor();
  T el = ctor.newInstance();
  c.add(el);
}
Run Code Online (Sandbox Code Playgroud)