迭代Java ArrayList并根据类执行不同的方法

Jos*_*ang 2 java netbeans

我对Java相对较新,并且对以下查询有任何帮助表示感谢.我定义了两类-为了简单起见,我们称他们为AB.Class A有一个名为的方法methodA,并Class B有一个名为的方法methodB.这两个类的对象包含在被ArrayList调用的中container.我需要做的是ArrayList根据对象的类型循环并调用不同的方法.

这是我目前的代码:

for (Object item : container) {
    if (item instanceof A) {
        item.methodA()
    } else if (item instanceof B) {
        item.methodB() 
    }
}
Run Code Online (Sandbox Code Playgroud)

我的IDE(NetBeans)不会编译上面的代码,因为item类型Object没有methodAmethodB.有没有其他方法来编写循环来完成我需要它做的事情?谢谢.

Cha*_*ion 5

你需要添加一个演员表.仅仅因为您检查了该项是A(或B)的实例,就不允许您在该项上调用A方法.

if (item instanceof A) {
    ((A) item).methodA();
} else if (item instanceof B) {
    ((B) item).methodB();
}
Run Code Online (Sandbox Code Playgroud)

但是,一般情况下,您可能需要考虑重构代码以避免此模式.例如,您可以创建A和B实现的基类的公共接口:

public interface MyInterface { 
    void doSomething();
}

class A : MyInterface {
    ...
    public void doSomething() { this.methodA(); }
}


class B : MyInterface {
    ...
    public void doSomething() { this.methodB(); }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

List<MyInterface> list = // a list of A's and B's
for (MyInterface item : list) { 
    // use polymorphism to invoke the appropriate method
    item.doSomething(); 
}
Run Code Online (Sandbox Code Playgroud)

访问者模式是用于这种类型的代码时要支持的一堆跨越一组固定的类不同常见的操作,而不改变不断这些类,这是有用的另一个常见的解决方案.