首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将java.lang.Object转换为自定义对象将引发ClassCastException

将java.lang.Object转换为自定义对象将引发ClassCastException
EN

Stack Overflow用户
提问于 2011-05-04 17:45:15
回答 6查看 7.8K关注 0票数 1

所以,这是个奇怪的问题。我在嵌入式环境中工作,我试图从一个应用程序向另一个应用程序发送消息(对象)。API-标准对象(如java.lang.String )将很好地工作,但是当我试图发送自定义类的对象时,会引发一个ClassCastException。

下面是设置:我有一个发送方应用程序和一个接收方应用程序。在发件人应用程序中,我实例化了一个UserUAI对象(包含在我编写的库中的一个自定义类),将其转换为对象,并使用环境API中包含的支持类ComManager将其发送到接收应用程序。但是没关系,它工作得很好,就像我之前说过的,如果我使用符合API的对象,我没有任何问题。

发送端:

代码语言:javascript
复制
UserUAI userUAI = new userUAI(/*param list*/);
ComManager.getInstance().sendMessage(targetAppPID, userUAI);
//method signature: void sendMessage(String targetAppPID, Object message)

接收端:

代码语言:javascript
复制
Object received = (UserUAI)receiver.getReceivedMessage(); 
UserUAI userUAI = (UserUAI)received; //raises exception
//method signature: Object getReceivedMessage();

我检查了、双重检查和三次检查,接收到的对象在运行时是UserUAI类型的。

另外,我还发布了Paŭlo Ebermann给我的一个建议的结果:

received.getClass() ->类nddigital.support.ricoh.UserUAI

UserUAI.class -> class nddigital.support.ricoh.UserUAI

received.getClass().getClassLoader() -> jp.co.ricoh.dsdk.osgi.service.multiXletManager.XletClassloader@2d4f9e

UserUAI.class.getClassLoader -> jp.co.ricoh.dsdk.osgi.service.multiXletManager.XletClassloader@4464ab

UserUAC.class == received.getClass() -> false

UserUAC.class.getClassLoader() == received.getClass().getClassLoader() -> false

我希望外面有人能帮我个忙。我会随时通知你的。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-05-04 20:57:26

对§4.3.4中的Java规范部分进行量化

两个引用类型是相同的运行时类型,如果: 它们都是类或两种接口类型,由同一个类加载器定义,具有相同的二进制名称(§13.1),在这种情况下,它们有时被称为相同的运行时类或相同的运行时接口。 它们都是数组类型,它们的组件类型是相同的运行时类型(§10)。

铸造倒置中,它说。

如果T是类类型,则R必须是与T相同的类(§4.3.4)或T的子类,或者抛出运行时异常。

因此,由于同一类是由不同的类加载器定义的,因此不能将其实例转换为其他类。

票数 3
EN

Stack Overflow用户

发布于 2011-05-04 17:50:18

例外情况下,receiver.getReceivedMessage()返回的对象显然不是UserUAI类型的。如果此方法必须返回对象,并且不能将其更改为返回特定类型,以防止从对象中强制转换盲类型,那么至少可以这样做。

代码语言:javascript
复制
Object received = receiver.getReceivedMessage();
if(received instanceof UserUAI)
{

   UserUAI userUAI = (UserUAI) received;
}

以防止错误。

票数 2
EN

Stack Overflow用户

发布于 2011-05-04 18:24:23

从注释到其他答案,似乎您有类加载程序问题。

试试这个:

代码语言:javascript
复制
Object received = receiver.getReceivedMessage();

System.out.println(received.getClass());
System.out.println(UserUAI.class);

System.out.println(received.getClass.getClassLoader());
System.out.println(UserUAI.class.getClassLoader());

System.out.println(UserUAI.class == received.class);
System.out.println(UserUAI.class.getClassLoader() == received.getClass.getClassLoader());

即使前两个输出看起来相同,如果由不同的类加载器加载,它们也是不同的类。

要解决这个问题,我们需要更多的上下文来说明您是如何使用这个的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5887600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档