声明并迭代扩展类的类的ArrayList

时间:2014-03-06 10:32:26

标签: java arraylist

我可能会以错误的方式解决这个问题,但是是否可以迭代扩展特定类的类集合?我正在考虑宣布:

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

但是会引发错误。有可能吗?

编辑:然后我会用:

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

右?

3 个答案:

答案 0 :(得分:1)

试试这个:

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

在该列表中您可以拥有任何实现InterfaceComponent的对象。

编辑:迭代如下:

for (InterfaceComponent t : components) { }

答案 1 :(得分:1)

构造函数 new 创建一个具体的实例编译时定义的类。

指令

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

在左侧,您可以编码 ,因为您声明了一组类的集合,但在右侧,您必须以明确的方式指出您收集的类。

答案 2 :(得分: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。< / p>

然而,这不是您想要的,因为我看到您希望在列表中存储InterfaceComponent的所有子类,然后您想要:

List = new ArrayList&lt;&gt;();

现在,您可以存储 <{1}}的任何具体实施,例如InterfaceComponent和/或A和/或B