相关疑难解决方法(0)

转换为同一个类时出现ClassCastException

我有2个不同的Java项目,一个有2个类:dynamicbeans.DynamicBean2和dynamic.Validator.

在另一个项目中,我动态加载这两个类并将它们存储在一个 Object

class Form {
    Class beanClass;
    Class validatorClass;
    Validator validator;
}
Run Code Online (Sandbox Code Playgroud)

然后我继续创建一个Validator对象validatorClass.newInstance()并使用它validator然后我创建一个bean对象并使用beanClass.newInstance()并将其添加到会话中.

portletRequest.setAttribute("DynamicBean2", bean);
Run Code Online (Sandbox Code Playgroud)

在Form项目的生命周期中,我调用validator.validate()从会话中加载先前创建的bean对象(我​​正在运行Websphere Portal Server).当我尝试将此对象强制转换为DynamicBean2失败并出现ClassCastException时.

当我将对象拉回会话时使用

faces.getApplication().createValueBinding("#{DynamicBean2}").getValue(faces);
Run Code Online (Sandbox Code Playgroud)

并使用.getClass()我得到检查它的类dynamicbeans.DynamicBean2.这是我想要将它强制转换为的类,但是当我尝试获取ClassCastException时.

我得到这个的原因是什么?

java reflection classcastexception websphere-portal

51
推荐指数
3
解决办法
7万
查看次数

无法强制转换为已实现的界面

我很困惑......

我有一个直接实现接口的类:

public class Device implements AutocompleteResult
{...}
Run Code Online (Sandbox Code Playgroud)

这证明我正在寻找正确的变量:

Object match = ...;
log.debug(match.getClass()); // Outputs 'Device'
log.debug(match.getClass().getInterfaces()[0]); // Outputs 'AutocompleteResult'
Run Code Online (Sandbox Code Playgroud)

然而,当我尝试将类的实例强制转换为接口时:

AutocompleteResult result = (AutocompleteResult) match;
Run Code Online (Sandbox Code Playgroud)

我得到了ClassCastException!

ClassCastException: Device cannot be cast to AutocompleteResult
Run Code Online (Sandbox Code Playgroud)

此外,isAssignableFrom返回false,我不知道为什么:

log.debug(AutocompleteResult.class.isAssignableFrom(Device.class));
Run Code Online (Sandbox Code Playgroud)

来自文档:

确定是否类或由这类对象表示接口是任一相同,或是一个超类或的超接口,由指定的Class参数所表示的类或接口.

我不应该总是能够将对象强制转换为其类实现的接口吗?

谢谢.

java inheritance classcastexception

38
推荐指数
1
解决办法
2万
查看次数