为什么在while循环中使用itrerator对象时需要进行类型转换?

时间:2017-06-03 08:32:15

标签: java collections

我正在学习java。在使用ArrayList编写遍历Iterator的代码时,我必须在使用带有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;
    }
}

3 个答案:

答案 0 :(得分:4)

制作您的Iterator UserId类型(指定类型),即

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

因为如果您没有指定类型,它将如何理解返回的内容。因此,为了通用目的,它将返回Object类型,这就是为什么需要向下转换。

答案 1 :(得分:2)

您必须为Iterator指定泛型类型,因为如果没有此类型,Iterator将保存Object类型:

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

为此需要转换每个Object。

另一个reference

  

it.next()返回下一个对象。如果正在访问通用列表,则迭代器将返回列表类型的某些内容。   预通用的Java迭代器总是返回Object类型,所以是一个向下转换   通常需要。

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

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

所以你可以在没有演员的情况下使用:

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

答案 2 :(得分:1)

你的迭代器被声明为raw,这就是你需要强制转换的原因,而是将iterator声明为 UserId Iterator<UserId>

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