【问题标题】:Use iterable on Collection<? super T>在 Collection<? 上使用可迭代超级T>
【发布时间】:2013-12-04 01:45:31
【问题描述】:

我是通配符的新手,在遍历 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.

我没有正确使用可迭代对象吗?任何帮助表示赞赏!

【问题讨论】:

  • 没有理由在一个循环中使用 foreach 循环而不是另一个循环。 Collection(更一般地说,Iterable)可以与 foreach 循环一起使用。

标签: java list generics collections wildcard


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    首先,由于您正在从集合中获取项目,因此您应该使用? 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&lt;? extends T&gt; 一起使用。

    【讨论】:

    • 非常感谢!这真的很有帮助!
    猜你喜欢
    • 2016-12-25
    • 2022-09-30
    • 2010-09-21
    • 1970-01-01
    • 2021-01-29
    • 2021-06-07
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    相关资源
    最近更新 更多