簡體   English   中英

遍歷Java ArrayList並根據類執行不同的方法

[英]Iterate over Java ArrayList and execute different methods depending on class

我是Java的新手,不勝感激有關以下查詢的任何幫助。 我定義了兩個類-為簡單起見,我們將它們稱為AB Class A有一個名為方法methodA ,和Class B有一個名為方法methodB 這兩個類的對象包含在名為containerArrayList container 我需要做的是遍歷ArrayList並根據對象的類型調用不同的方法。

這是我目前的代碼:

for (Object item : container) {
    if (item instanceof A) {
        item.methodA()
    } else if (item instanceof B) {
        item.methodB() 
    }
}

我的IDE(NetBeans的)將不會編譯上面的代碼,因為item類型的Object沒有methodAmethodB 還有其他方法可以編寫循環來完成我需要做的事情嗎? 謝謝。

您需要添加演員表。 僅僅因為您檢查了該項是A(或B)的實例,就不允許您在該項上調用A方法。

if (item instanceof A) {
    ((A) item).methodA();
} else if (item instanceof B) {
    ((B) item).methodB();
}

通常,盡管如此,您可能需要考慮重組代碼以避免這種模式。 例如,您可以創建A和B都實現的基類的通用接口:

public interface MyInterface { 
    void doSomething();
}

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


class B : MyInterface {
    ...
    public void doSomething() { this.methodB(); }
}

然后你可以這樣做:

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

訪客模式是此類代碼的另一種常見解決方案,當您希望在固定的類集上支持大量不同的常見操作而無需不斷修改這些類時,此模式很有用。

您正在處理變體問題,Java(以及幾乎任何其他廣泛使用的語言)都沒有很好的答案。 Scala通過案例類解決了這個問題,而像ML這樣的學術語言可以輕松處理它。

所有上述答案都建議使用if-ladder和cast,這是Java中最簡潔的解決方案,但它基本上放棄了完整的編譯時安全性。 如果您不喜歡演員表,可以使用訪客模式來解決問題。 它就像你能得到的那樣冗長,但它完全是類型安全的。

interface ABVariantVisitor {
    void visit( A a );
    void visit( B b );
}

interface ABVariant {
    void accept( ABVariantVisitor v );
}

class A implements ABVariant {
    // ...
    void accept( ABVariantVisitor v ) {
        v.visit( this );
    }
    // ...
}

class B implements ABVariant {
    // ...
    void accept( ABVariantVisitor v ) {
        v.visit( this );
    }
    // ...
}

List< ABVariant > container;

// ...

for ( ABVariant item : container ) {
    item.accept( new ABVariantVisitor() {
        @Override void visit( A a ) {
            a.methodA();
        }
        @Override void visit( B b ) {
            b.methodB();
        }
    } );
}

只需在調用方法之前將類型轉換為A或B。在調用方法之前將項目轉換為A或B.

for (Object item : container) {
    if (item instanceof A) {
       ((A) item).methodA();;
    } else if (item instanceof B) {
       ((B) item).methodB();
    }
}

以這種方式嘗試

       if (item instanceof A) {
            ((A) item).methodA();
        } else if (item instanceof B) {
            ((B) item).methodB();
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM