【问题标题】:create array list of instances of annotated classes创建注释类实例的数组列表
【发布时间】:2015-11-19 13:32:06
【问题描述】:

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

这是我的代码:

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
    }
}

我该如何解决这个问题?

【问题讨论】:

  • 也不确定这是否与您的问题有关,但是.....您的变量与Object instance.....list.add(object) 不匹配。您创建了一个名为instance 的变量,然后添加了一个名为object的变量

标签: java list class reflection


【解决方案1】:

您应该将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);
    }
}

但是,请注意,如果类没有默认构造函数,这可能会引发异常。

【讨论】:

  • 您应该在 for 循环中使用泛型 for Class
【解决方案2】:

你必须将它投射到你的界面

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

也可以写成

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

【讨论】:

    猜你喜欢
    • 2013-12-02
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2011-10-18
    • 2016-05-09
    • 1970-01-01
    • 2017-05-31
    • 2014-04-21
    相关资源
    最近更新 更多