如何获得参数化的Class实例

由于引入了generics,Class被参数化,因此List.class生成Class 。 这很清楚。

我无法弄清楚的是如何获得一个自身参数化的类型的实例,即Class <List >。 就像在这个片段中一样:

public class GenTest { static  T instantiate(Class clazz) throws Exception { return clazz.newInstance(); } public static void main(String[] args) throws Exception { // Is there a way to avoid waring on the line below // without using @SuppressWarnings("unchecked")? // ArrayList.class is Class, but I would like to // pass in Class<ArrayList> ArrayList l = GenTest.instantiate(ArrayList.class); } } 

我经常遇到这个问题的变化,我仍然不知道,如果我只是错过了什么,或者是否真的没有更好的方法。 谢谢你的建议。

Class类是类型的运行时表示。 由于参数化类型在运行时经历类型擦除,因此Class的类对象与Class >和Class >的类对象相同。

您无法使用.class表示法实例化它们的原因是这是用于类文字的特殊语法。 当语言类型被参数化时, Java语言规范明确禁止使用此语法,这就是不允许使用List .class的原因。

类表示由类加载器加载的类,它们是原始类型。 要表示参数化类型,请使用java.lang.reflect.ParameterizedType。

我认为你不能做你想做的事。 首先,你的实例化方法不知道它处理参数化类型(你可以很容易地传递它java.util.Date.class)。 其次,由于擦除,在运行时对参数化类型进行特别特定的操作是困难或不可能的。

如果你以不同的方式处理问题,你可以做其他一些小动作,比如类型推断:

 public class GenTest { private static  List createList() { return new ArrayList(); } public static void main(String[] args) { List list = createList(); List list2 = createList(); } } 

你唯一能做的就是直接实例化List并调用它的getClass()

 instantiate(new List() { ... }.getClass()); 

对于具有多个抽象方法(如List类型,这非常尴尬。 但不幸的是,调用子类构造函数(如new ArrayList )或工厂方法( Collections.emptyList() )不起作用。