在Collection<? super T>中使用可迭代对象

5

我对通配符不太熟悉,正在遍历一个集合类型时出现了问题。我需要将此函数转换为适用于任何Collection类型,而不仅仅是List,以下是我的做法:

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

changed to:

     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.

我是否没有正确使用可迭代对象?欢迎任何帮助!


没有理由在一个循环中使用foreach循环而不使用另一个循环。Collection(甚至更一般的Iterable)可以和foreach循环一起使用。 - newacct
2个回答

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>

非常感谢!这真的很有帮助! - user2125844

1
问题在于你没有在类中定义T。因此,你需要为这个类添加参数化类型。这是修改后的类行:
public class YourClassName<T> // add <T> as parameterized type

我希望这对你有用。如果想获取更多关于泛型类型的信息,请查看泛型类型。请注意,保留HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接