2014-03-06 49 views
0

我可能會用錯誤的方式去解決這個問題,但是是否可以迭代擴展特定類的類的集合呢?我正在考慮宣佈:聲明並遍歷ArrayList中擴展類的類

ArrayList<? extends InterfaceComponent> components = new ArrayList<? extends InterfaceComponent>(); 

但是會引發錯誤。可能嗎?

編輯:我會再重複雖然它具有:

for (<? extends InterfaceComponent> t : components) 
    { 
     t.callSomeMethod(); 
    } 

,對嗎?

回答

1

試試這個:

ArrayList<InterfaceComponent> components = new ArrayList<InterfaceComponent>();

這名單上可以有一個實現InterfaceComponent任何對象。

編輯:重複這樣的:

for (InterfaceComponent t : components) { }

+0

我沒有意識到,如果有東西延伸它,那麼它可以添加都一樣。猜猜我錯了,謝謝 – DuskFall

+0

我的名聲在哪裏? :3 –

+0

我無法接受另一個像9分鐘,雖然,對不起 – DuskFall

1

構造操作創建一個具體的實例編譯時定義的類。

指令

new ArrayList<? extends InterfaceComponent>(); 

一點兒也不是指任何具體的類:相反,它定義一組允許的類/接口的(只有類/接口什麼延伸InterfaceComponent)。

單位理論例如

ArrayList<? extends JFrame> components1 = new ArrayList<HelpFrame>();//HelpFrame is a concrete subclass of JFrame - ok 
ArrayList<? extends JFrame> components2 = new ArrayList<HelpDialog>();//HelpDialog is a concrete subclass of JFrame -ok 

ArrayList<? extends JFrame> componentsBoh = new ArrayList<? extends JFrame>();//is componentsBoh a HelpFrame? Or a HelpDialog? I don't know! - ko 

在左側,因爲你聲明組類的集合,你可以編寫,但在右側你在你收集什麼樣的類的明確的方式來表示。

+0

現在有更多的意義,感謝清除這對我來說,我從來不知道 – DuskFall

+0

奇怪的是,它是相同的概念,你可以實例化具體的類,但不是abtract類(它指的是更多潛在的子類)或一個接口(它指的是更多潛在的類或子接口)。該聲明以更抽象的視角工作。 – alepuzio

1

把你InterfaceComponent和一些具體類:

public class A implements InterfaceComponent { } 
public class B implements InterfaceComponent { } 
public class C implements InterfaceComponent { } 

當你聲明:

List<? extends InterfaceComponent> list; 

則列表可能僅持有InterfaceComponent一個具體實施,一旦你創建它list = new ArrayList<A>();,它裏面可能只有A

但是這不是你想要的,因爲我看到你想要的InterfaceComponent所有子類存儲在您的列表,然後你想:

名單=新的ArrayList <>();

您現在可以存儲任何具體實施InterfaceComponent,因此,例如A,和/或B和/或C