【问题标题】:Why type casting is required while using itrerator object in the while loop? [duplicate]为什么在 while 循环中使用 itrerator 对象时需要类型转换? [复制]
【发布时间】:2017-06-03 08:32:14
【问题描述】:

我现在正在学习java。在编写使用Iterator 遍历ArrayList 的代码时,我必须在使用带有next() 函数的迭代器对象之前使用类名。有人可以帮我解决这个问题吗?

import java.util.*;

public class arraylistwithuserdefinedclass {
    public static void main(String[] args) {    
        ArrayList<UserId> details=new ArrayList<UserId>();
        UserId a=  new UserId(22,"gurmeet");    
        UserId b=  new UserId(24,"sukhmeet");
        details.add(a);
        details.add(b);
        Iterator itr = details.iterator();
        while(itr.hasNext()) {    
            UserId ui = (UserId) itr.next();
            System.out.println(ui.age +" " + "" + ui.name) ;
        }
    }       
}

class UserId {
    int age;
    String name;
    UserId(int a, String b) {
        age=a;
        name=b;
    }
}

【问题讨论】:

    标签: java collections


    【解决方案1】:

    使你的迭代器UserId类型(指定类型),即

    Iterator<UserId> itr = details.iterator();
    

    因为如果不指定类型,它将如何理解返回什么。因此,出于通用目的,它将返回 Object 类型,这就是需要向下转换的原因。

    【讨论】:

    【解决方案2】:

    您必须为 Iterator 指定泛型类型,因为没有此类型,Iterator 拥有 Object 类型:

    Iterator itr = details.iterator();// This holds type Object.
    

    为此需要强制转换每个对象。


    另一个reference

    it.next() 返回下一个对象。如果访问通用列表,迭代器将返回列表类型的内容。 前泛型 Java 迭代器总是返回 Object 类型,所以很失望 通常是必需的。


    如果您设置迭代器的类型,则不需要:

    Iterator<UserId> itr = details.iterator();
    //         ^^--------------------------
    

    所以你可以不用强制转换:

    while (itr.hasNext()) {
        UserId ui = itr.next();
    //-------------^
    

    【讨论】:

    • 如果我在不强制转换的情况下使用它,那么它会显示一个错误并且我无法编译我的代码
    • 你必须像我已经提到的那样使用Iterator&lt;UserId&gt; 而不仅仅是Iterator @GURMEETSINGH
    • 检查我的编辑@GURMEETSINGH 你现在会明白更多
    • 感谢您清除我的概念。
    【解决方案3】:

    您的迭代器被声明为原始的,这就是您需要强制转换的原因,请改为将迭代器声明为 UserId 执行Iterator&lt;UserId&gt;

    Iterator<UserId> itr = details.iterator();
        while(itr.hasNext()) {
            ...
            UserId ui = (UserId)
    

    【讨论】:

    • 是的,我收到此警告 ** 迭代器是原始类型。对泛型类型 Iterator 的引用应该被参数化**。但是这里的 raw 是什么意思。
    • 请告诉我如何解决这个问题。
    • raw 表示没有类型
    • 就在答案中...做 Iterator 而不是 Iterator
    • raw 表示您没有提供类型参数。将它们视为动态类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 2021-05-08
    相关资源
    最近更新 更多