假设您有以下内容:
@AllArgsConstructor
public class Foo<A> {
A a;
}
并且您拥有以下内容:
Foo<String> fooString = new Foo<>("abc");
Foo<Integer> fooInteger = new Foo<>(10);
List<Foo> foos = new ArrayList<>();
foos.add(fooString);
foos.add(fooInteger);
我希望能循环遍历foos列表。
for (Foo foo : foos) {
...
}
首先,有没有实现这个功能的不同方法?
然后,如何引用列表中每个foo对象的通用类型?我尝试使用通配符,但遇到一个编译错误"capture#1-of-? ..."。
Foo
时,你正在使用一个原始的泛型。不要这样做。为了使列表包含Foo<String>
和Foo<Integer>
,请将其声明为List<Foo<?>>
。循环应该是for (Foo<?> foo : foos)
,现在你有了构建混合列表时普遍存在的正常问题:在调用instanceof
时你不知道每个值的类型。因此,在循环内部需要像if (foo.getA() instanceof String) { ... }
这样的代码,这通常是一个坏主意。 - Andreas