创建具有共同基础 class 的 Java 元class 的列表

Create list of Java metaclasses that have common base class

我有几个 class 源自共同基础 class。

public class BaseClass ...

public class ClassA extends BaseClass ...

public class ClassB extends BaseClass ...

我需要将那些 classes 存储在列表中,我可以通过它们的索引检索它们并在运行时创建特定的实例,我可以使用以下工作代码来做到这一点:

    List<Class> a = new ArrayList<Class>();
    a.add(ClassA.class);
    a.add(ClassB.class);

    Class c = a.get(0);
    BaseClass m = (BaseClass) c.getConstructor().newInstance();

我想知道是否有任何方法可以判断该列表中的任何 class 必须是 BaseClass 的后代。我想确保只能将 BaseClass 的后代添加到列表中。类似以下内容:

    List<Class<BaseClass>> a = new ArrayList<Class<BaseClass>>();
    a.add(ClassA.class);
    a.add(ClassB.class);

但是上面的代码抛出编译器错误:

Error:(135, 10) error: no suitable method found for add(Class<ClassA>)
method List.add(Class<BaseClass>) is not applicable
(actual argument Class<ClassA> cannot be converted to Class<BaseClass> by method invocation conversion)
method List.add(int,Class<BaseClass>) is not applicable
(actual and formal argument lists differ in length)
method Collection.add(Class<BaseClass>) is not applicable
(actual argument Class<ClassA> cannot be converted to Class<BaseClass> by method invocation conversion)

List<Class<BaseClass>> 表示只有确切的 BaseClass.class 可以用作集合的元素。根据定义,你的问题是你想插入 sub类:

List<Class<? extends BaseClass>> a = new ArrayList<Class<? extends BaseClass>>();

将确保允许 sub类 但不允许其他 类。

使用以你的基数为上限的通配符 class:

List<Class<? extends BaseClass>> a = new ArrayList<Class<? extends BaseClass>>();

如果您像在代码中那样声明它:

List<Class<BaseClass>> a = new ArrayList<Class<BaseClass>>();

它不会工作,因为 Class<ClassA> 不是 Class<BaseClass> 的子类型,即使 ClassA 扩展 BaseClass.

此处演示:http://ideone.com/SJGEIz