在Collection <! - 上使用iterable超级T - >

时间:2013-11-20 07:11:59

标签: java list generics collections wildcard

我是通配符的新手,并且在迭代Collection类型时遇到问题。我不得不将此函数转换为适用于任何Collection类型,而不仅仅是List,这就是我所做的:

    void sell(List<T> items) {
       for (T e : items) {
         stock.add(e);
       }
    }

更改为:

     void sell(Collection<? super T> items) {

        Iterator ir = items.iterator();

        while (ir.hasNext()){
            stock.add((T)ir.next());
        }
    }

然而,当我编译代码时,我收到错误:

Note: Shop.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

我没有正确使用iterable吗?任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:8)

首先,由于您要从集合中提取项目,因此应使用? extends T而不是? super T

其次,您应该使用参数化Iterator,而不是原始类型。这就是你收到警告的原因。

将您的方法更改为:

void sell(Collection<? extends T> items) {

    Iterator<? extends T> ir = items.iterator();

    while (ir.hasNext()){
        stock.add(ir.next());
    }
}

您仍然可以将原始for循环与Collection<? extends T>一起使用。

答案 1 :(得分:1)

问题是你没有在课堂上定义T.所以你必须在这个类中添加参数化类型。这是修改后的类行:

public class YourClassName<T> // add <T> as parameterized type

我的目的是这对你有用。 获取有关泛型类型的更多信息,只需查看Generic Type