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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 逝去的记忆ヽ 中级黑马   /  2012-6-18 12:33  /  2084 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 逝去的记忆ヽ 于 2012-6-18 20:21 编辑

直接上代码:

public static void main(String[] args)
{
  ArrayList al = new ArrayList();
  al.add("dfafd");
  al.add("jdsasf");
  al.add("sadfd");
  al.add("jaads");

for (Iterator it = al.iterator(); it.hasNext() ; )
  {
   //String s = (String)it.next();//为什么这里一定要强转一下呢?直接用String类中的方法为什么不行啊?
   sop(it.next());//我的问题是:这里接受的是添加进来的字符串。那么他应该具备字符串应有发方法啊?可是it.next().length()就会报错。
  }

6 个回复

倒序浏览
本帖最后由 唐辉辉 于 2012-6-18 12:42 编辑

你应该还没有学习到泛型。
如果在定义ArrayList和Iterator时指定了其接收的类型,后面就不用强转,也可以调用其方法了。下面是更改后的代码,请参考:
public static void main(String[] args) {
                ArrayList<String> al = new ArrayList<String>();
                al.add("dfafd");
                al.add("jdsasf");
                al.add("sadfd");
                al.add("jaads");
               
               
                for(Iterator<String> it =  al.iterator(); it.hasNext();){
                       
                        String s = it.next();
                        System.out.println(s);
                        //System.out.println(it.next().length());
                }
        }
回复 使用道具 举报
本帖最后由 陈嘉宾 于 2012-6-18 12:51 编辑

直接打印字符串遍历就可以,但是要获得长度就得用String类型的方法了所以要强转成String类型可以使用String类的特有方法,而上面用的都是ArrayList的方法,所要要强转,接受字符串只做了打印动作。要用到字符串的特有方法只能强转,或者接下来的泛型。
回复 使用道具 举报
你可以看一下API文档里,next()的返回值是什么?目前你还没接触到泛型,所以要进行一个强转过程。
回复 使用道具 举报
解释见代码
  1. public static void main(String[] args)
  2. {
  3.   ArrayList al = new ArrayList();
  4.   al.add("dfafd");
  5.   al.add("jdsasf");
  6.   al.add("sadfd");
  7.   al.add("jaads");

  8. for (Iterator it = al.iterator(); it.hasNext() ; )
  9.   {
  10.    //String s = (String)it.next();//构造容器的时候加入泛型,这里就不用使用强转。
  11.    sop(it.next());//因为jvm就不知道你传入的是什么类型,所以不具备你说的那些方法。只有jvm知道了类型才能有这些方法。
  12.   }
复制代码
回复 使用道具 举报
刚刚回答了另一个朋友的问题和你这个差不多给你粘过来了:

我想你是想问 为什么往ArrayList里面明明传的是String类的对象;为什么通过跌代器出来后还是Object的类型是吧;
要弄清楚这个问题在毕老师后面的泛型会有详细的讲解;
我在这儿给你大概解释一下 说的不全面希望可以帮到你;当成是后面视频的预习吧;
首先你可以查阅API可以发现ArrayList的后面是带着泛型的;
什么是泛型;通俗的讲就是在往ArrayList集合里存元素之前就确定元素的类型,不是指定的元素不能存;把运行时的错误提前到编译时期;让程序更安全。
以你的这个代码为例:因为你的ArrayList集合没有加泛型;所以往你里存的所以元素都是以Object的形式存入的 而所有的对象都是Object的子类;所以编译可以 通过 ;而在
迭代过程中也是以Object的形式往外返;而你.length方法是String类的特有方法;Object并不具备;所以会报错;提示你找不符号;在学习泛型之前的解决方案是把Object对象向下转换,这样才可以调用子类的特有方法也就String类的特有方法;
在学习了泛型之后就应该这样写了:
import java.util.*;
class ABC
{
public static void main(String[] args)
{
   ArrayList<String> al = new ArrayList<String>();
   al.add("dfafd");
   al.add("jdsasf");
   al.add("sadfd");
   al.add("jaads");

for (Iterator<String> it = al.iterator(); it.hasNext() ; )
   {
    //String s = (String)it.next();//因为父类引用不具备子类特有功能;所以没有加泛型且没有向下转换时就会报错;
   sop(it.next().length());//加了泛型就可以了;
   }
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马