来自实现公共接口的对象列表的 ClassCastException

ClassCastException from a List of objects which implement a common interface

我有一个实现 IApplication 接口的 classes 列表:

public interface IApplication {
    public void start();
}
public class Configurator implements IApplication {
    public void start() {...};
}

public static void main(String[] args) {
    List<IApplication> apps = new ArrayList<IApplication>();
    apps.add(new Configurator());

    apps.get(0).start(); //ClassCastException   
}

当我的 Main 函数的最后一行被执行时,我得到一个 ClassCastException:

java.lang.ClassCastException: Configurator cannot be cast to IApplication

即使我将 Configurator 对象实例化为 IApplication,我也会收到以下错误:

IApplication app = new Configurator();
app.start();

java.lang.IncompatibleClassChangeError: Class Configurator does not implement the requested interface IApplication

在 Java 中不应该允许这样做吗?这可能是我的配置 class 没有通过实现正确更新的问题吗?实现通用接口的对象列表中的 ClassCastException

您似乎从不同的包中加载了两个不同的接口,都命名为 IApplication。在 OSGI 中,来自不同包的 classes(以及接口、枚举等)总是不同的,即使它们具有相同的名称和包名称!

Configurator 实现包 com.configurator-plugin 中的 IApplication 接口,而您的 main 方法引用包 [=] 中的 IApplication 接口16=].

如果它们应该是 相同的 界面,您应该将其从其中一个包中删除,并确保它是从另一个包中导出的,并确保包导出接口的是使用它的包的依赖项。

没有简单的方法来指定从哪个包加载 class 或接口,因为 Java 语言没有包的概念。如果他们应该是两个不同的接口,我建议你确保他们有不同的名称(然后问题应该很清楚)。