我是java和JSP的新手,我对访问tag类的方法有疑问。我创建了3个自定义标签,即Primary,Secondary,Axis。所以我可以访问
<pre:Primary>
<pre:Axis/>
</pre:Primary>
<pre:Secondary>
<Pre:Axis/>
</pre:Secondary>
在Axis Tag类中,我必须访问父方法,在这种情况下,primary,secondary是Axis标记的父方法。在两个父类中,我有方法addItem(),我在轴类中调用如下方法。
Object parent=null;
try{
parent = (PrimaryWrapper)getParent();
}catch(Exception e){
parent = (SecondaryWrapper)getParent();
}
parent.addItem(axisItem);
但这显示错误,&#34;方法addItem(StringBuilder)未定义类型Object&#34;,我知道在try中,只捕获父级的范围正在更改为primary / secondary,因此错误发生。但我必须访问基于Primary,Secondary的相应addItem方法。可能吗?或者我做错了。
提前致谢
答案 0 :(得分:1)
问题是parent
变量属于类Object
,因此您分配给它的任何内容都只能使用Object
的方法。我基本上看到了两种可能的解决方案。
快速而肮脏
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);
或者,正如Hacketo的评论中提到的,您可以创建一个共同的祖先类(例如Wrapper
)并在那里实现常用方法,而不是创建和接口。 AxisTag
的代码与上述带接口的解决方案类似。