当前位置: 首页 > 面试题库 >

java.lang.ClassCastException的含义:someClass与someClass不兼容

孟和怡
2023-03-14
问题内容

我在XPages应用程序中偶尔遇到异常:

java.lang.ClassCastException: someClass incompatible with someClass.

提到的两个类是相同的,它是用作会话bean的类。我无法用Google搜索涵盖我的问题的任何内容。通常的解释是设计元素的变化,而不是我的情况。

从那时起,XPage应用程序变得不可用(使用会话bean someClass的页面),直到重新启动http任务或重新保存faces-config.xml。

在某些情况下,这与其他异常有关:

com.ibm.jscript.InterpretException: Script interpreter error, line=x, col=y: 
Java method 'method(signature containg someClass)'
on java class 'someOtherClass' not found

这种行为的背后是什么?


问题答案:

Philippe Riand通过电子邮件对此进行了解释:

之所以进行此类转换,是因为同一类已由2个不同的类加载器加载了两次。因此,从Java的角度来看,它们是不同的,并且强制转换失败。

现在,每个XPages应用程序都有自己的类加载器。但是,每次对应用程序进行设计更改时,例如通过Domino
Designer,都将丢弃此类装入器。这是必需的,因为对XPages的更改会生成一个新的Java类,然后应加载该Java类,而不是先前的Java类。发生这种情况时,将放弃类加载器并创建一个新的类加载器。然后,即使它们没有更改,所有与应用程序相关的类都会根据需要重新加载。这是J2EE服务器实现的常见行为。也就是说,如果你的代码是在一个范围内缓存的对象,它是

发生设计更改时将其丢弃,则很可能会发生这种情况。例如,当发生设计更改时,applicationScope和sessionScope当前不会被丢弃,这可能会导致此问题。这是一种设计选择,因为放弃范围有时会给开发人员带来不好的体验,但是有这个缺点。


最后,保存faces-
config.xml是一种解决方法。保存此文件后,整个模块(包括作用域)将从内存中丢弃,这说明了其工作原理。更改自定义Java类应重新加载模块并消除问题。

因此,似乎是将bean(甚至间接地)放入sessionScope或applicationScope中也是原因。



 类似资料:
  • 问题内容: 我注意到了Collections.sort的规格: 为什么这里需要“ ”?如果是extend ,那么我们是否不能保证a 仍然能够比较两个对象而没有“ ”部分? 换句话说,给出以下代码: 为什么即使不为Collections.sort()的声明指定“ ”,编译器也不足够聪明地知道这是可以的? 问题答案: Josh Bloch今年在Google I / O上做了一个名为“ 有效Java重新

  • 问题内容: 这样的方法声明有什么区别: 还有这个: 我的看法是,他们两个都指定传入的对象 必须 是type的子类,那么在这种情况下为什么还要烦恼泛型呢? 问题答案: 在您的情况下,差别不大。 但是请考虑以下几点: 在这种情况下,您可以通过以下方式调用该方法: 如果您使用 您将只能执行以下操作:

  • 但我得到了这个: 我的榜样。 我在一个模型中有两个类: ***数据库中的firstName和lastName为空。 当firstName和lastName为null时,ModelMapper将my ClientDto设置为null。 映射后OrderDto的输出:“OrderDto(ordernumber=123,ordersize=10cm,orderdescription=some order

  • 问题内容: 尽管此类并非旨在被设置为可序列化的类,但我仍收到此异常警告!有人可以让我知道你是否遇到过这样奇怪的警告? 问候 问题答案: 当您从实现Serializable的类派生时,将出现此警告。在您的情况下,Serializable父类是JFrame。 您可以使用@SuppressWarnings(“ serial”)禁止显示此警告,也可以为该类指定一个serialVersionUID:(点的长

  • 问题内容: 我目前正在一个主要是Objective-C的项目中编写一些Swift代码。在我们的ObjC代码中,我们有一个声明为的标头。然后,我们可以声明一个@property,它只能是实现的子类。 (注意:并且不是我定义的;它们是GPUImage库的一部分) 即使标头是在导入的标头中#import的,我们的Swift代码似乎也无法识别这一点。我试图在Swift中复制声明,但是这些都不是正确的语法: