【发布时间】:2010-03-02 20:10:26
【问题描述】:
如何为像Collection<SomeObject> 这样的通用集合获取java.lang.Class 的实例?
我正在寻找类似以下的内容:
Class clazz = Collection<SomeObject>.class;
【问题讨论】:
-
你需要它做什么?
如何为像Collection<SomeObject> 这样的通用集合获取java.lang.Class 的实例?
我正在寻找类似以下的内容:
Class clazz = Collection<SomeObject>.class;
【问题讨论】:
你不能。类型擦除意味着你不能这样做。
你可以做的是:
【讨论】:
正如其他人所说,类型在运行时被擦除。您必须将类对象提供给您的方法。假设所有扩展 SomeObject 的类都具有不带参数的构造函数,则可以使用反射创建对象。示例:
public <T extends SomeObject> Collection<T> getObjects(Class<T> clazz) {
List<T> result = new ArrayList<T>();
for(int i=0; i<3; i++) {
try {
T t = clazz.getConstructor((Class[]) null).newInstance((Object[]) null);
// do something with t
result.add(t);
} catch (Exception e) {
// handle exception
}
}
return result;
}
如果你有一个扩展SomeObject的类,你可以使用这样的方法:
class ObjA extends SomeObject {
}
Collection<ObjA> collection = getObjects(ObjA.class);
【讨论】:
在运行时这些类型会被删除。如果您获取 Collection 的实例并调用 getClass(),您将简单地获取 Collection 类。
还有其他反射 API 可以获取有关使用类型参数声明的成员的信息。
【讨论】: