【问题标题】:How do you get an instance of java.lang.Class for a generic collection like Collection<SomeObject>?如何为 Collection<SomeObject> 这样的通用集合获取 java.lang.Class 的实例?
【发布时间】:2010-03-02 20:10:26
【问题描述】:

如何为像Collection&lt;SomeObject&gt; 这样的通用集合获取java.lang.Class 的实例?

我正在寻找类似以下的内容:

Class clazz = Collection<SomeObject>.class;

【问题讨论】:

  • 你需要它做什么?

标签: java generics class


【解决方案1】:

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

你可以做的是:

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

【讨论】:

    【解决方案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);
    

    【讨论】:

      【解决方案3】:

      在运行时这些类型会被删除。如果您获取 Collection 的实例并调用 getClass(),您将简单地获取 Collection 类。

      还有其他反射 API 可以获取有关使用类型参数声明的成员的信息。

      【讨论】:

      • 但是,如果你有一个没有在编译时声明泛型类型的字段,你将永远无法学习泛型类型。
      • @Konrad:我有点困惑,一个字段怎么会有泛型类型但在编译时没有声明?
      • 对象 obj = new ArrayList();列表 obj = new ArrayList(); - 据我所知,你不会发现 obj 是一个 ArrayList.
      猜你喜欢
      • 1970-01-01
      • 2021-07-10
      • 2022-11-09
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 2021-03-27
      相关资源
      最近更新 更多