怎么做`MyClassJava中的.class`?


问题内容

在无法实例化或扩展MyClass的地方如何public <T> T doit(Class<T> clazz);使用MyClass<String>.classclazz进行调用。

编辑:“ David Winslow”和“ bmargulies”响应是(MyClass<String>) doit(MyClass.class);原始问题的正确作品,但令人惊讶的是,该方法返回说MyClass<T>而不是T强制类型转换时将不再编译。

编辑:我已经用MyClass替换列表,并将条件添加到我原来的问题。


问题答案:

使用List.class。因为类型擦除类型参数的Java类是完全编译时结构-
即使List<String>.class是有效的语法,这将是 完全一样的类
List<Date>.class,等等。由于反射本质上是一个运行时的东西,它不处理好类型参数(用Java实现)。

如果要使用Class对象(例如)实例化新的List实例,则可以 将该操作 的结果 强制转换 为具有适当的type参数。

List<String> list = (List<String>)(ArrayList.class.newInstance());