鉴于以下情况(下面的UML),
如果Y有方法:
public void PrintWs();
和X有:
ArrayList <P> myPs = new ArrayList();
Y y = new Y();
Z z = new Z();
myPs.add(y);
myPs.add(z);
如何遍历每个myPs对象并调用所有Ys PrintWs(不使用instanceof)?
http://starbucks.mirror.waffleimages.com/files/68/68c26b815e913acd00307bf27bde534c0f1f8bfb.jpg
对不起,澄清一下:
答案 0 :(得分:1)
你不能 - 假设你只想尝试在Y的实例上调用PrintWs
,你需要确定哪些 指向实例的引用Y ...这就是你使用instanceof
的地方。 (您可以使用Y.class.isInstance(p)
,但这只是略有不同的形式。)
当然如果你可以让P包含一个no-op PrintWs
然后在Y中覆盖,那么你可以在列表中的所有内容上调用它...
答案 1 :(得分:0)
好吧,你可以尝试在try块中向下转换Y
并抓住任何ClassCastException
...这不是我在代码中会做的事情,但是从字面上看,回答你的问题: - )
更好的解决方案是将PrintWs()
(使用空的默认实现)向上移动到类P
- 然后您可以在myPs
的所有元素上调用它而无需向下转换。
答案 2 :(得分:0)
如果Y和Z是P的子类,则可以使用空实现将方法的声明移动到P并在Y中覆盖它。这样,您可以在ArrayList中的所有对象上调用该方法,但只能调用Y的实例将具有该方法的实现。