Java jsp中不同类的访问方法
我不熟悉java和JSP,我对访问标记类的方法有疑问。我已经创建了3个自定义标记,即主标记、次标记和轴标记。这样我就可以访问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
<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);