假设我有一个实现接口的类:
public class A implements IB
我有一个List<A>
我想参考:List<? implements IB> list
。
所以我可以编码:for (IB item : list)
等。
可以在Java中以某种方式完成吗?没有<? implements ...>
可能性。
我错过了什么?
答案 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解释了如何将?
与super
和extends
一起使用,以指定参数为给定的超类或子类的参数类。
答案 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)