<分区>
我正在使用 NetBeans 和 Maven 构建一个 JEE 项目。该项目包含一个 EJB 模块、一个 Web 模块和一个 SE 类库。像往常一样,Web 模块将 EJB 模块作为依赖项。它们都将类库作为依赖项。该项目是使用 GlassFish 或 JBoss 以及最近的 WildFly 工作多年的项目的修改副本。原始项目是使用 Ant 构建和部署的。现在我正在使用 Maven。新的 (maven) 项目使用 GlassFish 运行良好,但不使用 WildFly 10。它在绝对不应失败的强制转换语句中抛出 ClassCastException。为了尝试确定问题的根源,我进行了一个简单的测试。它的结果是完全奇怪的。在这里:
首先我创建了 3 个接口(interface),一个在类库中,一个在每个模块中。它们是:
// interface at the class library
package jee2ap102.lib;
public interface I01 {
}
// interface at the EJB module
package jee2ap102.ejb;
public interface I0101 extends jee2ap102.lib.I01 {
}
// interface at the Web module
package jee2ap102.web;
public interface I010101 extends jee2ap102.ejb.I0101 {
}
然后在 Web 模块中我创建了一个 bean 并添加了以下方法:
public String check() {
boolean b;
b = jee2ap102.lib.I01.class.isAssignableFrom(jee2ap102.ejb.I0101.class);
b = jee2ap102.lib.I01.class.isAssignableFrom(jee2ap102.web.I010101.class);
b = jee2ap102.ejb.I0101.class.isAssignableFrom(jee2ap102.web.I010101.class);
}
这三个语句应该返回 true,但只有最后一个语句返回 true。 据此,位于类库中的接口(interface) I01 是层次结构的根,不能从位于库外部的任何接口(interface)(EJB 或 Web 模块)分配,不管这些接口(interface)是什么接口(interface)扩展它。一致地,尝试将 I0101 或 I010101 转换为 I01 将抛出 ClassCastException。
如果能帮助我理解和解决这个问题,我将不胜感激。