Java jsp中不同类的访问方法

Java jsp中不同类的访问方法,java,jsp,Java,Jsp,我不熟悉java和JSP,我对访问标记类的方法有疑问。我已经创建了3个自定义标记,即主标记、次标记和轴标记。这样我就可以访问 <pre:Primary> <pre:Axis/> </pre:Primary> <pre:Secondary> <Pre:Axis/> </pre:Secondary> 但这是一个错误,“类型对象的方法addItem(StringBuilder)未定义”,我知道在try中,catch-on

我不熟悉java和JSP,我对访问标记类的方法有疑问。我已经创建了3个自定义标记,即主标记、次标记和轴标记。这样我就可以访问

<pre:Primary>
  <pre:Axis/>
</pre:Primary>

<pre:Secondary>
<Pre:Axis/>
</pre:Secondary> 
但这是一个错误,“类型对象的方法addItem(StringBuilder)未定义”,我知道在try中,catch-only-parent的作用域正在更改为primary/secondary,因此发生了错误。但我必须访问基于主、辅的适当addItem方法。可能吗?或者我做错了


提前感谢

问题在于
父变量属于类
对象
,因此您分配给它的任何内容都只能使用
对象
的方法。我认为基本上有两种可能的解决办法

又快又脏

Object parent = getParent();
if (parent instanceof PrimaryWrapper) {
  ((PrimaryWrapper) parent).addItem(axisItem);
} else if (parent instanceof SecondaryWrapper) {
  ((SecondaryWrapper) parent).addItem(axisItem);
} else {
  // log error?
}
更好地使用界面

// define an interface
public interface ItemContainer {
  void addItem(StringBuilder item);
}

// change your Wrappers to implement the interface, i.e.
public class PrimaryWrapper extends ... implements ItemContainer {
  // ... your code, just add @Override annotation to the addItem(...) method
}
// and
public class SecondaryWrapper extends ... implements ItemContainer {
  // ... your code, just add @Override annotation to the addItem(...) method
}

// and finally, fix the AxisTag code
ItemContainer parent = (ItemContainer) getParent();
parent.addItem(axisItem);

或者,正如Hacketto的评论中提到的,您可以创建一个公共祖先类(例如,
包装器
)并在那里实现公共方法,而不是创建和接口。
AxisTag
的代码与上面的界面解决方案类似。

您听说过
instanceof
吗?是的,也尝试过这个对象parent=getParent();if(PrimaryWrapper的父实例){parent=(Primary)parent;}else parent=(Secondary)parent;父项添加项(axisItem);您必须创建一个公共类,它可以是
包装器
,并添加一个方法
addItem
,您可以在每个子类中重写该方法
// define an interface
public interface ItemContainer {
  void addItem(StringBuilder item);
}

// change your Wrappers to implement the interface, i.e.
public class PrimaryWrapper extends ... implements ItemContainer {
  // ... your code, just add @Override annotation to the addItem(...) method
}
// and
public class SecondaryWrapper extends ... implements ItemContainer {
  // ... your code, just add @Override annotation to the addItem(...) method
}

// and finally, fix the AxisTag code
ItemContainer parent = (ItemContainer) getParent();
parent.addItem(axisItem);