0

在尝试context.lookup()在我的门户应用程序中投射调用结果时,我ClassCastException在投射不同结果的三分之二的尝试中得到了一个。

经过一些研究,我认为:http ://wiki.sdn.sap.com/wiki/display/TechTSG/%28AS+Java%29+ClassCastException+Occurs+After+Lookup+Operation拥有答案,但事实并非如此真正解释如何执行这两个步骤。

此代码用于从存储在以下位置的路径中获取 iView 的详细信息list

IiView transView1 = (IiView) context.lookup(list.get(i).toString());

但是当获取这样的工作集的详细信息时:

IPcdContext attrSet = (IPcdContext) context.lookup(list.get(i).toString());

我得到一个ClassCastException. 任何有关我为什么会收到此错误的帮助或解释将不胜感激!

编辑:这是代码的基础:http ://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/6112ecb7-0a01-0010-ef90-941c70c9e401?overridelayout =真

edit2:我从 context.lookup 得到的对象是com.sapportals.portal.pcd.pcm.roles.PortalWorkset我找不到文档的。

4

1 回答 1

1

如果context.lookup返回 a PortalWorkset,则无法“绕过” ClassCastException。

强制转换不会对象转换为不同的类 - 它只是告诉编译器您确定它是比其当前声明的类型更具体的类的一种方式。在这种情况下,您是在说“我意识到该lookup()方法被声明为 return Object,但是当我在这个特定的上下文中调用它时,我确信它总是会专门返回一个IPcdContext对象。” 您在这里的假设结果不成立,并且程序通过抛出异常正确地发出信号。

您的问题可能有两个原因:

  1. 您的假设通常是正确的,但是由于逻辑错误,您没有将您期望的字符串传递给该lookup方法,因此完全得到了错误的东西。在这种情况下,请确保传递给方法的参数始终正确。
  2. 你的假设是不正确的,你可能并不总是得到IPcdContext回报。在这种情况下,您需要决定如何处理返回的其他对象,并适当地处理它们(您可以使用instanceof运算符检查返回对象的类)。

在任何情况下,无论何时进行强制转换,检查它是否会首先成功通常是有益的,使用如下成语:

IPcdContext context;
Object obj = context.lookup("foo");
if (obj instanceof IPcdContext) {
    context = (IPcdContext)obj;
}
else {
    // You got back something else.  What to do?
}
于 2012-07-17T16:05:16.673 回答