我可能会以错误的方式解决这个问题,但是是否可以迭代扩展特定类的类集合?我正在考虑宣布:
ArrayList<? extends InterfaceComponent> components = new ArrayList<? extends InterfaceComponent>();
但是会引发错误。有可能吗?
编辑:然后我会用:
迭代它 for (<? extends InterfaceComponent> t : components)
{
t.callSomeMethod();
}
右?
答案 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
。