创建带注释类的实例的数组列表

时间:2015-08-25 17:55:29

标签: java list class reflection

我在创建实例的arraylist时遇到问题。我得到了一个Set<Class<?>>,然后检查它们是否实现了特定的接口。如果他们这样做,我想将此类的实例添加到特定接口的arraylist。

这是我的代码:

ArrayList<MyInterface> list = new ArrayList<>();
for (Class clazz : annotatedClasses) {
    if(MyInterface.class.isAssignableFrom(clazz)) {
        Object instance = clazz.getConstructor().newInstance();
        list.add(object); //ERROR: Object != MyInterface
    }
}

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

您必须将其强制转换为界面

Object instance = clazz.getConstructor().newInstance();
list.add((MyInterface)instance); 

也可以写成

MyInterface instance = (MyInterface) clazz.getConstructor().newInstance();
list.add(instance); 

答案 1 :(得分:4)

您应该将newInstance的结果转换为所需类型。你知道这不会抛出ClassCastException,因为你只是检查它是可分配的。

List<MyInterface> list = new ArrayList<>();
for (Class<?> clazz : annotatedClasses) {
    if (MyInterface.class.isAssignableFrom(clazz)) {
        Object instance = clazz.getConstructor().newInstance();
        list.add((MyInterface) instance);
    }
}

但是,请注意,如果类没有默认构造函数,则会抛出异常。