来自实现公共接口的对象列表的 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 语言没有包的概念。如果他们应该是两个不同的接口,我建议你确保他们有不同的名称(然后问题应该很清楚)。
我有一个实现 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 语言没有包的概念。如果他们应该是两个不同的接口,我建议你确保他们有不同的名称(然后问题应该很清楚)。