所以,这是个奇怪的问题。我在嵌入式环境中工作,我试图从一个应用程序向另一个应用程序发送消息(对象)。API-标准对象(如java.lang.String )将很好地工作,但是当我试图发送自定义类的对象时,会引发一个ClassCastException。
下面是设置:我有一个发送方应用程序和一个接收方应用程序。在发件人应用程序中,我实例化了一个UserUAI对象(包含在我编写的库中的一个自定义类),将其转换为对象,并使用环境API中包含的支持类ComManager将其发送到接收应用程序。但是没关系,它工作得很好,就像我之前说过的,如果我使用符合API的对象,我没有任何问题。
发送端:
UserUAI userUAI = new userUAI(/*param list*/);
ComManager.getInstance().sendMessage(targetAppPID, userUAI);
//method signature: void sendMessage(String targetAppPID, Object message)接收端:
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
我希望外面有人能帮我个忙。我会随时通知你的。
发布于 2011-05-04 20:57:26
对§4.3.4中的Java规范部分进行量化
两个引用类型是相同的运行时类型,如果: 它们都是类或两种接口类型,由同一个类加载器定义,具有相同的二进制名称(§13.1),在这种情况下,它们有时被称为相同的运行时类或相同的运行时接口。 它们都是数组类型,它们的组件类型是相同的运行时类型(§10)。
在铸造倒置中,它说。
如果T是类类型,则R必须是与T相同的类(§4.3.4)或T的子类,或者抛出运行时异常。
因此,由于同一类是由不同的类加载器定义的,因此不能将其实例转换为其他类。
发布于 2011-05-04 17:50:18
例外情况下,receiver.getReceivedMessage()返回的对象显然不是UserUAI类型的。如果此方法必须返回对象,并且不能将其更改为返回特定类型,以防止从对象中强制转换盲类型,那么至少可以这样做。
Object received = receiver.getReceivedMessage();
if(received instanceof UserUAI)
{
UserUAI userUAI = (UserUAI) received;
}以防止错误。
发布于 2011-05-04 18:24:23
从注释到其他答案,似乎您有类加载程序问题。
试试这个:
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());即使前两个输出看起来相同,如果由不同的类加载器加载,它们也是不同的类。
要解决这个问题,我们需要更多的上下文来说明您是如何使用这个的。
https://stackoverflow.com/questions/5887600
复制相似问题