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

时间:2015-08-05 22:05:10

标签: java interface casting osgi classcastexception

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

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中是否应该允许这样做?可能是我的Configuration类没有通过实现正确更新的问题吗?来自实现公共接口的对象List的ClassCastException

1 个答案:

答案 0 :(得分:2)

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

Configurator实现了包IApplication中的com.configurator-plugin接口,而您的main方法指的是来自包IApplication的{​​{1}}接口}。

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

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