java - 是否可以创建一个在运行时反射(reflect)类的 List<class> ?

标签 java generics reflection

假设我使用反射来查找类的子类型(我正在使用 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/

相关文章:

java - 如何在 Jersey 中反序列化对象字段

java - 使用 drawImage 时出现 NullPointerException(使用 Slick2d)

java - Spring 3+。通过占位符中的前缀解析属性

c# - C# 中非泛型接口(interface)的泛型成员实现的类型约束

c# - 如何反射(reflect)应用于枚举类型本身的自定义属性

java - newInstance() 与新的

java - 了解应用程序如何从服务器提取数据,以便可以从 web 应用程序或其他应用程序完成相同的请求

c# - 是否可以创建使用可空 int 作为泛型参数的类?

java - 链表的泛型实现和交换两个泛型对象