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

Ger*_*ard 11 java generics

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

public class A implements IB
Run Code Online (Sandbox Code Playgroud)

我有一个List<A>我想提到的:List<? implements IB> list.所以我可以编码:for (IB item : list)

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

coo*_*ird 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);
}
Run Code Online (Sandbox Code Playgroud)

更多信息可以在The Java Tutorials上找到,它有一个关于泛型综合课程.

特别是,关于通配符部分解释了如何使用?with superextends指定一个参数,该参数是给定类的超类或子类.


Osc*_*Ryz 7

关于什么:

List<? extends IA> list;
Run Code Online (Sandbox Code Playgroud)


Pau*_*ley 3

如果您的意思是 A 类实现 IA,而不是 IB,那么您的代码应该可以这样说

for (A item : list) {
    // handle item as if it is an IA
}
Run Code Online (Sandbox Code Playgroud)

因为根据定义,所有 A 都是 IA。

同时,没有通配符<? implements C>。有<? extends C>, 且C可以是接口或类;但是,这对于您似乎正在尝试做的事情来说并不是必需的。

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