我正在学习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;
}
}
答案 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)