我正在尝试使用多态来简化我在servlet会话中存储的对象的工作,并且我不断获得ClassCastExceptions。我正在使用Struts框架(1.3.10和Struts 2)
我有以下内容:
class A{
// fields omitted
A{ // initialize}
load{ //- no implementation }
// getters + setters
}
class B extends A{
// fields omitted
B { // initialize }
@Override
load{ // specific implementation}
}
class C extends A{
// fields omitted
C { // initialize }
@Override
load{ // specific implementation}
}
现在,我实例化如下,操作并存储在会话中。
A obj = new B();
//-- manipulate and load fields here
request.getSession().setAttribute("obj", obj);
后来,我想要检索这个对象。
A laterObject = (A) request.getSession().getAttribute("obj");
//fails to give me B's load() implementation. Same issue for C's load() implementation.
我也试过
A laterObject = (B) request.getSession().getAttribute("obj");
// ClassCastException
我的问题:有没有办法检索EITHER(B)或(C)并运行为每个对象专门实现的每个加载方法?我想要做的是使用多态来使我的代码适用于B或C,但似乎在演员表中搞砸了(至少我认为这是问题所在)。也许有另一种方式?也许我的演员搞砸了?
答案 0 :(得分:0)
Obj属于A级
首先你的铸造Obj是A到A,这就是为什么你得到As方法
第二次将超类A(A)转换为子类B. A不知道B