java所有实现接口的对象列表

时间:2009-09-22 15:07:58

标签: java generics

假设我有一个实现接口的类:

public class A implements IB

我有一个List<A>我想参考:List<? implements IB> list。 所以我可以编码:for (IB item : list)等。

可以在Java中以某种方式完成吗?没有<? implements ...>可能性。 我错过了什么?

6 个答案:

答案 0 :(得分:20)

使用extends

public void someMethod(List<? extends IB> list) {
  for (IB e : list) {
    // Perform some processing on each element.
  }
}

public void anotherMethod() {
  List<A> list = new ArrayList<A>();
  someMethod(list);
}

可在The Java Tutorials找到更多信息,其中comprehensive lesson on Generics

特别是,section on wildcards解释了如何将?superextends一起使用,以指定参数为给定的超类或子类的参数类。

答案 1 :(得分:7)

怎么样:

List<? extends IA> list;

答案 2 :(得分:3)

如果你的意思是A类实现了IA,而不是IB,那么你的代码就可以了。

for (A item : list) {
    // handle item as if it is an IA
}

因为所有的As都是定义的IAs。

同时,<? implements C>没有通配符。有<? extends C>C可以是接口或类;但是,这似乎不是你想要做的事情所必需的。

如果您想明确说出for (IA item : list),因为您不保证该列表中的项目是A,但保证它们是IA,那么我认为您有一个小问题(我无法确定,因为你没有说明这个列表处理代码的位置)。根据定义,List<A> List<IA>;如果您正在构建List<A>然后将其传递给期望List<IA>的方法,则会出现编译时错误。但是,您可以创建List<IA>并将其填入A。其原因在Java的泛型教程中有所解释。

答案 3 :(得分:2)

您可以使用extends

执行此操作
List<? extends IA> list

答案 4 :(得分:1)

好吧,您可以将其声明为List<IA>

为了进一步构建,List可以存储在其中实现IA的任何对象。问题是,在将它们检索回来时,如果没有对其进行.getClass(),则不会知道原始类。

示例:

List<IA> list = new ArrayList<IA>();
// code to populate list here
for (IA item : list) {
    item.iaMethod();
}

答案 5 :(得分:0)

不需要使用List<? extends IB> list的替代方案

public class A implements IB{

}

List<A> listOfConcreteClassA = new ArrayList<A>();

// convert to interface
List<IB> listOfInterfaceB = new ArrayList<IB>(listOfConcreteClassA)