我有一个实现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
答案 0 :(得分:2)
您似乎从不同的包中加载了两个不同的接口,这两个接口都名为IApplication
。在OSGI中,来自不同bundle的类(以及接口和枚举等)总是不同的,即使它们具有相同的名称和包名称!
Configurator
实现了包IApplication
中的com.configurator-plugin
接口,而您的main
方法指的是来自包IApplication
的{{1}}接口}。
如果它们应该是相同的界面,则应将其从其中一个捆绑包中删除,并确保将其从另一个捆绑包中导出,并确保导出接口的bundle是使用它的bundle的依赖项。
没有简单的方法来指定从哪个类加载类或接口,因为Java语言没有开始使用bundle的概念。如果它们应该是两个不同的接口,我建议你确保它们有不同的名称(然后问题应该清楚)。