如何获得像Collection <someobject>这样的泛型集合的java.lang.Class实例?</someobject>

时间:2010-03-02 20:10:26

标签: java generics class

如何为java.lang.Class这样的通用集合获取Collection<SomeObject>的实例?

我正在寻找以下内容:

Class clazz = Collection<SomeObject>.class;

3 个答案:

答案 0 :(得分:3)

你做不到。类型擦除意味着你不能这样做。

你能做的是:

  1. 声明泛型类型的字段。
  2. 调用反射API以获取Type。例如。 Field.getGenericType()。
  3. 使用Type API查看参数。

答案 1 :(得分:2)

正如其他人所说,这些类型在运行时被删除。您必须为方法提供类对象。假设所有扩展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);

答案 2 :(得分:1)

在运行时,这些类型将被删除。如果您使用Collection的实例并调用getClass(),您将只获得Collection类。

还有其他反射API来获取有关使用type参数声明的成员的信息。