与servlet会话属性的多态性

时间:2015-07-25 07:03:53

标签: java servlets polymorphism session-variables

我正在尝试使用多态来简化我在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,但似乎在演员表中搞砸了(至少我认为这是问题所在)。也许有另一种方式?也许我的演员搞砸了?

1 个答案:

答案 0 :(得分:0)

Obj属于A级

首先你的铸造Obj是A到A,这就是为什么你得到As方法

第二次将超类A(A)转换为子类B. A不知道B