假设我使用反射来查找类的子类型(我正在使用 Google Reflections 库)。
Set<Class<? extends Parent>> subTypes = reflections.getSubTypesOf(Parent.class);
现在我想通过迭代集合的成员来为每个子类型创建一个列表,所以我想要这样的东西:
try {
for (Class<? extends Parent> cType : subTypes.iterator()) {
Class x = Class.forName(cType.getName());
List<x> list = new ArrayList<x>();
}
} catch(ClassNotFoundException ex){
...
}
但是,这不起作用,编译器会提示列表定义中的“x 是未知类”。
有没有办法根据反射类型定义列表?
最佳答案
你可以定义
<T> static List<T> listForType(Class<T> elementType) {
return new ArrayList<T>();
}
然后你可以尝试
Class<X> xClass = cType;
List<X> listOfX = listForType(xClass);
但是该语言无法从变体类型参数 生成不变类型参数
。X
吗?以类型安全的方式扩展 Parent
如果您在其他地方确实有不变类型,只要您的子类型本身不是参数化类型,您就可以通过将未经检查的代码限制在一个小地方来获得类型安全的代码。
final class ListPerSubType {
private final Map<Class<? extends Parent>, List> listPerSubType = new LinkedHashMap<>();
public <T extends Parent> List<T> get(Class<T> cl) {
// TODO: throw IllegalArgument if cl is parameterized.
if (!listPerSubType.containsKey(cl)) {
listPerSubType.put(cl, new ArrayList<T>());
}
List list = listPerSubType.get(cl);
// This is type-safe since no other code exposes the
// lists via type not gained from a type token.
@SuppressWarnings("unchecked")
List<T> typedList = list;
return list;
}
}
关于java - 是否可以创建一个在运行时反射(reflect)类的 List<class> ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32913696/