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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 严露华 中级黑马   /  2013-4-30 20:01  /  1849 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 严露华 于 2013-5-1 23:09 编辑

今天下午再看毕老师的课时,在毕老师的原代码加了泛型后,代码出现问题?为什么加了泛型之后,就不能将数据加进去呢?求解?
  1. import java.util.*;
  2. public class ArrayListTest {

  3.         public static void main(String[] args) {
  4.                
  5.                 ArrayList<String> al = new ArrayList<String>();
  6.                 al.add("java01");
  7.                 al.add("java01");
  8.                 al.add("java02");
  9.                 al.add("java03");
  10.                
  11.                   al = singleElement(al);
  12.                 System.out.println(al);

  13.         }
  14.         public static ArrayList<String> singleElement(ArrayList<String> al){
  15.                 ArrayList<String> newAl = new ArrayList<String>();
  16.                 Iterator<String> it =al.iterator<String>();
  17.                 while(it.hasNext()){
  18.                         Object obj = it.next();
  19.                         if(!newAl.contains(obj)){
  20.                                 newAl.add(obj);
  21.                         }
  22.                 }
  23.                 return newAl;
  24.         }

  25. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

8 个回复

倒序浏览
        public static ArrayList<String> singleElement(ArrayList<String> al){

                ArrayList<String> newAl = new ArrayList<String>();

                Iterator<String> it =al.iterator();//这里不能加泛型的

                while(it.hasNext()){

                        Object obj = it.next();

                        if(!newAl.contains(obj)){

                                newAl.add((String) obj);

                        }

                }

                return newAl;

        }
Iterator<String> it =al.iterator<String>();这一句,方法名跟括弧之间里木有泛型

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 陈雨 于 2013-4-30 20:21 编辑

没加泛型时,add()增加的对象是Object类,迭代器取出的也是Object类,但是你加了<String>类的泛型后,你集合都是字符串的对象了,Object obj = it.next();这里取出Object对象肯定冲突啊,需要将Object转成String类。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
Iterator<String> it =al.iterator<String>();  这句话写错了 应该为Iterator<String> it =al.iterator(); 的
newAl.add(obj); 编译检测这句话是过不了的,
因为定义newAl定义了泛型,就是为了让程序员按指定的数据存入集合中,
避免后面运行时期,调用集合里数据的时候产生类型转换等异常,定义泛型机制就是让这个可能产生的错误提前编译时期,方便提前处理好

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
何锦权 发表于 2013-4-30 20:12
Iterator it =al.iterator();  这句话写错了 应该为Iterator it =al.iterator(); 的
newAl.add(obj); 编译 ...

按照你这种方式修改了下,编译依旧不能通过
回复 使用道具 举报
严露华 发表于 2013-4-30 20:25
按照你这种方式修改了下,编译依旧不能通过

Object obj = it.next();这里取出Object对象肯定冲突啊,需要将Object转成String类。
回复 使用道具 举报
Iterator<String> it = al.iterator<String>(); //1 对于一个已经存在的容器,其存储元素已经具有相应的数据类型,迭代器上还用指定吗?故应该修改为Iterator<String> it = al.iterator();

Iterator<String> it =al.iterator();
                while(it.hasNext()){
                        Object obj = it.next();       //2 姑且认为这句也成立

                        if(!newAl.contains(obj)){

                                newAl.add( obj);//3 add(E e) 中只能添加指定泛型的对于类型元素子类父类均不行,可以将其修改为newAl.add((String) obj);
                                                          //   Object obj = it.next();   由于迭代器已经加泛型指定了数据类型,可以直接获取该类型不用使用Object
                        }
                 }

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
泛型类型有错
   |---ArrayList<String>集合中是存储String对象的
       |---newAl.add(obj);obj是一个Object类型的对象。
   |---如果是ArrayList<Object>的可以倒是可以存储String类型的对象,因为Object是String的父类

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

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