我有几个派生自公共基类的类。
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)
答案 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