A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 江大海 于 2013-5-18 10:46 编辑

为什么在迭代的时候不可以直接Person p = it.next()呢?it。next取出来的不就是person对象吗?
为什么还要各种转型
代码展示如下
                                                                                                                      ------------------来自黑马云青年    大大大海
  1. /*
  2.         需求:将自定义的对象作为元素存到ArrayList集合中,并去除重复元素
  3.         比如:存人对象,同姓名同年龄视为同一人,为重复元素
  4.         思路:自定义Person类,创建对象存到ArrayList中,
  5.                         判断姓名年龄是否相同,相同则不存入
  6.                         取出集合
  7. */
  8. import java.util.*;
  9. class Person
  10. {
  11.         private String name;
  12.         private int age;
  13.         Person(String name,int age)
  14.         {
  15.                 this.name = name;
  16.                 this.age = age;
  17.         }
  18.         public String getName()
  19.         {
  20.                 return name;
  21.         }
  22.         public int getAge()
  23.         {
  24.                 return age;
  25.         }

  26. }
  27. class ArrayListTest
  28. {
  29.         public static void main(String[] args)
  30.         {
  31.                 ArrayList al = new ArrayList();
  32.                 al.add(new Person("张2",21));
  33.                 al.add(new Person("张1",21));
  34.                 al.add(new Person("张2",21));
  35.                 al.add(new Person("张3",21));
  36.                 al.add(new Person("张1",21));
  37.                 al.add(new Person("张3",21));
  38.                
  39.                 for (Iterator it = al.iterator();it.hasNext() ; )
  40.                 {
  41.                         Object obj = it.next();//----------------------------问题在这里
  42.                         Person p = (Person)obj;//it.next()取出的不就是Peason对象吗?为什么不可直接Person p = it.next();这样获取,还要各种转型呢??求解释
  43.                         /*Person p = it.next();*/
  44.                         sop(p.getName()+"--------"+p.getAge());
  45.                 }

  46.         }
  47.         public static void sop(Object obj)
  48.         {
  49.                 System.out.println(obj);
  50.         }
  51.         public static ArrayList singleArr(ArrayList al)
  52.         {
  53.                 ArrayList newAl = new ArrayList();
  54.                
  55.                 for (Iterator it = al.iterator();it.hasNext() ; )
  56.                 {
  57.                         //迭代器中一个hasNext只能对应一个next,不然就打印了两个
  58.                         Object obj = it.next();
  59.                         if (!newAl.contains(obj))
  60.                                         newAl.add(obj);
  61.                 }
  62.                 return newAl;

  63.         }
  64. }
复制代码

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
袁梦希 + 1 + 3 有代码和注释,很给力

查看全部评分

2 个回复

倒序浏览
那是因为在代码的第32行: ArrayList al = new ArrayList(); 你没有声明泛型(也就是要告诉编译器:ArrayList 要存储什么类型的对象)。

如果没有声明泛型,ArrayList 集合默认存储Object类型的对象,所以 it.next() 取出的当然是Object类型的,不是Person类型的,所以第43行就要转型了。

如果第32行代码改为  ArrayList<Person> al = new ArrayList<Person> ();  这样声明泛型之后,43行就不需要强转类型了。


                                                                                            。。。。黑马云青年,为您作答。。。。

点评

大家好样的!  发表于 2013-5-18 10:42

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
袁梦希 + 1 + 3

查看全部评分

回复 使用道具 举报
it.next()取出的不就是Peason对象吗:p.getName()+"--------"+p.getAge():Object中没有 getName() 和 getAge() 方法,List集合中你没有定义泛型,他默认存储的是Object;类型。
根据多态的特性,父类对象想要调用子类中的方法,把父类的类型强转成子类类型。才能调用getName() 和 getAge() 方法。希望能对你有帮助!!!

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马