use*_*844 5 java generics collections list wildcard
我是通配符的新手,并且在迭代Collection类型时遇到问题.我不得不将此函数转换为适用于任何Collection类型,而不仅仅是List,这就是我所做的:
void sell(List<T> items) {
for (T e : items) {
stock.add(e);
}
}
Run Code Online (Sandbox Code Playgroud)
变成:
void sell(Collection<? super T> items) {
Iterator ir = items.iterator();
while (ir.hasNext()){
stock.add((T)ir.next());
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我编译代码时,我收到错误:
Note: Shop.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Run Code Online (Sandbox Code Playgroud)
我没有正确使用迭代吗?任何帮助表示赞赏!
首先,由于您从集合中获取项目,因此您应该使用? extends T
而不是? super T
.
其次,您应该使用参数化Iterator
而非原始类型.这就是你收到警告的原因.
将您的方法更改为:
void sell(Collection<? extends T> items) {
Iterator<? extends T> ir = items.iterator();
while (ir.hasNext()){
stock.add(ir.next());
}
}
Run Code Online (Sandbox Code Playgroud)
您仍然可以使用原始for
循环Collection<? extends T>
.