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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jsfjb 中级黑马   /  2012-12-13 09:50  /  2397 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Iterator中next检索出来的元素强转的问题。
  1.                 HashSet hs = new HashSet();
  2.                 hs.add(new Person("aa1",11));
  3.                 hs.add(new Person("aa2",22));
  4.                 hs.add(new Person("aa3",33));
  5.                
  6.                 Iterator it = hs.iterator();
  7.                 while(it.hasNext()){
  8.                         Person p = (Person) it.next(); //这儿为什么非要强转。 我看的帮助文档中Iterator的next方法的返回值是: E 。不是Object。
  9.                         System.out.println(p.getName()+"::"+p.getAge());
  10.                 }
复制代码

评分

参与人数 1技术分 +1 收起 理由
崔政 + 1

查看全部评分

8 个回复

倒序浏览
底层确实返回的相应类型,估计是编译器没改吧?或者是为了向下兼容。
回复 使用道具 举报
这里肯定是要强转的  助文档中Iterator的next方法的返回值是: E  E代表的是泛型  如果你定义下泛型就可以不需要强转了  如Iterator<Person> it = hs.iterator();

点评

+1  发表于 2012-12-13 17:27
回复 使用道具 举报
E就是element 元素的意思,在泛型中就代表所有的类型,你可以把它看成是Object类型,老师说过的,所以那儿就必须得强转,明白了吧
回复 使用道具 举报
E next()
          返回迭代的下一个元素。
这是手册的解释,它的意思是返回它的一个元素。但是如果要获取元素的内容(值,名字等),就必须明确这是个什么元素,才能获取。所以必须强转或者先用泛型定义。
Person p = (Person) it.next();       如果没有强转的话,在编译时,就通过不了,因为编译时,无法确定等式的右边一定是person类型。只有把它强转成person类型,左右两边才能对等。编译也就不会出错。大概就是这样了。

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
猜想所以person类也继承了 elements那个类
回复 使用道具 举报
filter 中级黑马 2012-12-17 17:00:45
7#
Person p = (Person) it.next();
编译的时候等号左右两边不会赋值,编译器只会检查你两端的返回值能不能赋值,=能不能成立,当然要强制转换了
加了泛型会告诉编译器两边的数据类型一致,系统判断能够通过
不加泛型即使强制转换了编译器虽然能够通过编译,还会警告数据类型不一致
回复 使用道具 举报
E就是泛型
  1. package Junit;

  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;

  5. import org.junit.Test;

  6. public class Test5 {
  7.         @Test
  8.         public void cry() {
  9.                 List<Person> list = new ArrayList<Person>();
  10.                 list.add(new Person("张三", 1));
  11.                 list.add(new Person("李四", 2));
  12.                 list.add(new Person("王五", 3));
  13.                 list.add(new Person("赵六", 4));

  14.                 Iterator<Person> it = list.iterator();
  15.                 while (it.hasNext()) {
  16.                         Person p = it.next();
  17.                         System.out.println("姓名:\t" + p.getUsername() + "\t" + "编号:\t"
  18.                                         + p.getId());
  19.                 }
  20.         }
  21. }
复制代码
回复 使用道具 举报
王斌 中级黑马 2012-12-19 10:31:25
9#
其实可以这样理解的, hs.add(new Person("aa1",11));
HashSet  向这个容器中添加的类型可以是object  的就是任意类型。但是此时
添加的是new 的一个Person类型的参数,也就是说,现在容器中都是Person类型的了
Person p = (Person) it.next(); //  返回的是E就是说不是向容器添加什么都可以遍历出来的
所以既然向容器中添加了Person类型的那么遍历出来的也应该是Person类型的才对阿,其它的类型
是不能被遍历出来的,这个就是要遍历时候转换成Person了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马