【问题标题】:java: warning: iterator is a raw type [duplicate]java:警告:迭代器是原始类型[重复]
【发布时间】:2018-10-16 19:41:19
【问题描述】:

我不明白为什么我的代码有这样的警告,这是我的代码:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
     response.setContentType("text/html");  
     PrintWriter out=response.getWriter(); 
    try {

             InputStream csvfile = null;

             FileItemFactory factory = new DiskFileItemFactory();

             ServletFileUpload upload = new ServletFileUpload(factory);
             Map<String, List<FileItem>> file = upload.parseParameterMap(request);
             
             Iterator entries = file.entrySet().iterator();
             while (entries.hasNext()) {
                  Entry thisEntry = (Entry) entries.next();
                  List<FileItem> value = (List) thisEntry.getValue();
                    for (FileItem uploadItem : value) {
                        csvfile = uploadItem.getInputStream();
                      }  // end of for loop
             }//while

            InputStreamReader isr = new InputStreamReader(csvfile);
            BufferedReader reader = new BufferedReader(isr);
           
            String text = "";
            reader.readLine();

我收到警告:iterator is a raw type. references to generic type iterator e

我该如何解决这个问题?

【问题讨论】:

    标签: java eclipse servlets iterator


    【解决方案1】:

    迭代器是参数化类型。

    Iterator entries = file.entrySet().iterator();
    

    应该是:

    Iterator< Entry< String, List<FileItem> > > entries = file.entrySet().iterator();
    

    迭代器的类型应该是Entry&lt;...&gt;,因为条目集从映射中返回一组条目。 ... 应该与您的地图类型相同。在你的情况下:

    // Type of map
    Map<String, List<FileItem> > 
    
    // Type of entries
    Entry< String, List<FileItem> >
    
    // Type of iterator
    Iterator< Entry< String, List<FileItem> > >
    

    不是获取迭代器并调用hasNext(),而是让java通过增强的for循环为你做这件事:

    // Just get the entry set, not the iterator
    Set< Entry<String, List<FileItem> > > entrySet = file.entrySet();
    
    // Java will inject the iterator, hasNext(), etc for you
    // This reads: "For each entry of type XYZ in entrySet, do the following..."
    
    for (Entry< String, List<FileItem> > entry : entrySet) {
    
        // Get the list from entry, entry is the result of entrySet.next()
        List<FileItem> list = entry.getValue();
    
        // Nested enhanced for loop use another iterator
        for (FileItem uploadItem : list) {
    
            csvfile = uploadItem.getInputStream();
        }  
    }
    

    【讨论】:

    • 喜欢这个?迭代器 >> entries = file.entrySet().iterator(); while (entries.hasNext()) { Entry > thisEntry = (Entry >) entries.next(); List value = (List) thisEntry.getValue(); for (List value1 : file.values()) { for (FileItem uploadItem : value1) { csvfile = uploadItem.getInputStream(); }
    • 您不需要投射。这就是您将类型放在&lt;&gt; 尖括号中的原因。如果你使用我写的第二行代码,你应该能够安全地删除所有的强制转换。此外,您可以在遍历条目集时使用增强的 for 循环以获得更简洁的语法。
    • @KenKaneki 更新了答案以包含用例
    • 我的英语不是专家,非常感谢你的帮助,你能告诉我简化吗
    • 不需要使用iterator()。使用这种语法for (Object obj : collection) { ... } 与使用while (iterator.hasNext()) { iterator.next() ... } 具有相同的效果,但是第一个使用的代码更少,因为Java 会为您调用iterator(), hasNext() and next(),因此您不必这样做。
    【解决方案2】:

    将Iterator 更改为Iterator&lt;Entry&lt;String, List&lt;FileItem&gt;&gt;&gt;,同样将Entry 更改为Entry&lt;String, List&lt;FileItem&gt;&gt;。

    但看起来您确实想循环遍历映射 files 中的值。在这种情况下,只需使用files.values()。无需使用任何Iterator 或Entry,以下替换您的整个while 循环:

    for (List<FileItem> value : files.values()) {
        for (FileItem uploadItem : value) {
             csvfile = uploadItem.getInputStream();
        }
    }
    

    您的完整代码如下所示:

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        response.setContentType("text/html");  
        PrintWriter out = response.getWriter();
    
        try {
            InputStream csvfile = null;
            FileItemFactory factory = new DiskFileItemFactory();
    
            ServletFileUpload upload = new ServletFileUpload(factory);
            Map<String, List<FileItem>> file = upload.parseParameterMap(request);
    
            for (List<FileItem> value : files.values()) {
                for (FileItem uploadItem : value) {
                     csvfile = uploadItem.getInputStream();
                }
            }
    
            InputStreamReader isr = new InputStreamReader(csvfile);
            BufferedReader reader = new BufferedReader(isr);
    
            String text = "";
            reader.readLine();
    

    【讨论】:

    • 我的错误是:从我编辑的代码中复制局部变量值,如下所示: for (List value : file.values()) { for (FileItem uploadItem : value) { csvfile = uploadItem.获取输入流(); } }
    • @KenKaneki 我的问题中的双for-loops 替换了您的整个while 循环。不应有任何重复的局部变量。
    • 我的英语不是专家,非常感谢你的帮助,你能告诉我简化吗
    • @KenKaneki 查看我的编辑。复制代码,它会工作。
    • 我真的很感谢你的帮助,现在我明白了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    相关资源
    最近更新 更多