创建具有公共基类的Java元类列表

时间:2015-05-14 13:37:45

标签: java java-7

我有几个派生自公共基类的类。

public class BaseClass ...

public class ClassA extends BaseClass ...

public class ClassB extends BaseClass ...

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

    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();

我想知道是否有任何方法可以说明该列表中的任何类都必须是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)

2 个答案:

答案 0 :(得分:5)

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

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

确保允许子类但不允许其他类。

答案 1 :(得分:3)

使用基类上限的通配符:

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