初学JAVA,集合迭代器问题

这两句输出有什么不一样呀!为什么一个可以输出,一个却输出不了?这是Account类的定义。图片说明图片说明

5个回答

泛型错误! 名为it的迭代器泛型指明为Accout,所以在it.next().toString() 的时候 取出字符串类型被强转为Accout,由于这两个类没关系所以报错。第一句输出之所以没报错,跟java的泛型实现有关,it.next()取出的不是Account类型 而是Object类型,没有强转所以不会报错。

SmallSmallhao
SmallSmallhao 回复nvnnv: 你的意思是编译器为了优化,如果只是调用.next()方法,那么不论泛型声明为什么都返回Object型,只有对.next()进行其它方法操作时才会将类型强制转换为所声明的泛型吗?
4 年多之前 回复
nvnnv
nvnnv 哦,还有,这其实是一个解语法糖的的问题,想要完全弄明白最好去了解下java的泛型是如何实现的
4 年多之前 回复
 用Iterator<Object>才行。
SmallSmallhao
SmallSmallhao 我不是要将它们输出来,只是奇怪为什么它们两个其中一个可以输出,另一个却不行?
4 年多之前 回复

用while(it.next){…}

SmallSmallhao
SmallSmallhao 回复Koeryo: 这个没啥关系吧?
4 年多之前 回复

按你写的
Iterator it = s.iterator();
就是指定了类型为Account,所以it.next()返回字符串时就会报类型不匹配,
Iterator it = s.iterator();

Iterator it = s.iterator();

都可以

mengqingyu555
暮云收尽溢清寒 pring只是用了String.valueOf 转为字符串输出,所以没报错,而你自己调用toString()的时候,就需要根据泛型调用对应的Account类的toString方法,这时才发现类型不匹配。
4 年多之前 回复
mengqingyu555
暮云收尽溢清寒 因为泛型不等于强制转型,第一个返回的类型还是被标记为Account,但是你后面直接print了,
4 年多之前 回复
SmallSmallhao
SmallSmallhao 回复mengqingyu555: 为啥第一个不报错呢?
4 年多之前 回复

集合类型并不是你这样用的,你用错误应用来探讨其原因,我觉得并没有太大的意义
首先,集合里的类型要一致
其次,在定义集合时最好要给出泛型
最后,遍历 List 的时候用 for (int i = 0; i < list.size(); i ++) 就好了
如果非要用 iterator 的话也应该用 while (it.hasNext) {}配套使用

SmallSmallhao
SmallSmallhao 回复永不止步: 没有哪个集合规定只能放一种类型的元素。我没声明具体的泛型,我当然可以随意添加不同类型的元素。
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐