如何为像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;
你不能。类型擦除意味着您不能这样做
您可以做的是:
你不能。类型擦除意味着您不能这样做 您可以做的是:
在运行时,这些类型将被擦除。如果您获取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。