黑马程序员技术交流社区
标题:
半夜遇疑问,真没搞懂,看我的代码,关于集合问题
[打印本页]
作者:
337091921
时间:
2013-5-13 02:02
标题:
半夜遇疑问,真没搞懂,看我的代码,关于集合问题
本帖最后由 337091921 于 2013-5-13 20:48 编辑
import java.awt.List;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
@SuppressWarnings("unused")
class Java {
public static void main(String[] args) {
Person p=new Person("唐明雨",33);
ArrayList li=new ArrayList();
li.add(p);
Iterator it=li.iterator();
while(it.hasNext()){
Person p1=(Person)it.next();
/*为什么要加这一步呢,直接写System.out.println(it.next()+p1.getName()+p1.getAge()); 不可以吗,是不是当add里的参数为对象时,都要跌加时,在强转,为什么呢?*/
System.out.println(p1.getName()+p1.getAge());
}
}
}
class Person {
String name;
int age;
public String getName(){
return name;
}
public int getAge(){
return age;
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
}
}
作者:
钟林杰
时间:
2013-5-13 03:43
Person p1=(Person)it.next();加上这一步是方便你在下面的程序中需要使用现在这个it.next()返回的对象中的方法或数据,因为next()方法里面有累加器,每次调用之后都会改变返回的对象,所以以上这一步你必须加上。如果不加上你的程序就需要写出it.next().getName()+it.next().getAge();这样你的数据就会出错,因为这句语句中的it.next().getName()和it.next().getAge()他们两个使用的对象都不同。如果迭代的时候只需要打印它的name或age其中一个,这时你就可以不用加上这一步:Person p1=(Person)it.next()。
作者:
飞鸟青崖
时间:
2013-5-13 08:05
直接把两句合成:System.out.println(it.next()+p1.getName()+p1.getAge());是不行的,因为p1你没有进行声明。
如果不要强转,直接写成:
Person p1 = it.next();
System.out.println(p1.getName()+p1.getAge());
这样写也不行,虽然对p1进行了声明,但是由于没有使用泛型,it.next()返回的对象是Object的,
所以Person p1 = it.next();相当于用一个Person的引用指向了Object的对象。不行。
如果你想不进行强制的话,可以使用泛型,代码如下:
public static void main(String[] args)
{
Person p=new Person("唐明雨",33);
ArrayList<Person> li=new ArrayList<Person>();//集合中加上泛型
li.add(p);
Iterator<Person> it=li.iterator();//迭代器上一定也要声明泛型,不然还得强制。
while(it.hasNext())
{
Person p1=it.next();//加了泛型,这里就不需要强制了。
System.out.println(p1.getName()+p1.getAge());
}
}
复制代码
作者:
刘胜寒
时间:
2013-5-13 08:30
为什么要强转,是因为没有使用泛型。
ArrayList li = new ArrayList<Person>();
下面就不用强转了。。
楼主记得及时结贴。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2