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

如何为像collection<;这样的通用集合获取java.lang.Class实例;SomeObject>;?,java,generics,class,Java,Generics,Class,对于像collection这样的通用集合,如何获取java.lang.Class的实例 我正在寻找以下内容: Class clazz = Collection<SomeObject>.class; Class clazz=Collection.Class; 你不能。类型擦除意味着您不能这样做 您可以做的是: 声明泛型类型的字段 调用反射API以获取类型。例如,Field.getGenericType() 使用类型API查看参数 你不能。类型擦除意味着您不能这样做 您可以做的是: 声

对于像
collection
这样的通用集合,如何获取
java.lang.Class
的实例

我正在寻找以下内容:

Class clazz = Collection<SomeObject>.class;
Class clazz=Collection.Class;

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

您可以做的是:

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

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

    您可以做的是:

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

  • 在运行时,这些类型将被擦除。如果您获取Collection的一个实例并调用getClass(),则只需获取Collection类


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

    在运行时,这些类型将被擦除。如果您获取Collection的一个实例并调用getClass(),则只需获取Collection类


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

    正如其他人所说,这些类型在运行时被擦除。必须为方法提供类对象。假设所有扩展
    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
    的类都有不带参数的构造函数,则可以使用反射创建对象。例如:

    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;
    }
    

    你需要它做什么?你需要它做什么?但是,如果你有一个字段在编译时没有声明泛型类型,你将永远无法学习泛型类型。@Konrad:我有点困惑,一个字段怎么会有泛型类型但在编译时没有声明?Object obj=new ArrayList();List obj=new ArrayList();-据我所知,您将无法找到obj是ArrayList。但是,如果您有一个字段在编译时没有声明泛型类型,您将永远无法学习泛型类型。@Konrad:我有点困惑,一个字段怎么会有泛型类型但在编译时没有声明?Object obj=new ArrayList();List obj=new ArrayList();-据我所知,你不会发现obj是ArrayList。