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

© 马林康 中级黑马   /  2012-6-14 06:53  /  2168 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. List l1=new ArrayList<Integer>();
  2. l1.add("abc");
  3. l1.add(1);
复制代码
为什么集合内能传入String对象?

9 个回复

倒序浏览
  1.                  List l1=new ArrayList<Integer>();//这样写,List中装的类型是Object。
  2.                  List<Integer> l1=new ArrayList<Integer>();//这样写,才能限定List中装的是Integer。
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
兄弟,你这样写有没有泛型<Integer>都一样,在编译的时候,list中可以存入任意类型的数据,而取出时当做Integer,但是编译完成以后,泛型就被去掉了,所以在运行时要取数据的时候,list中有什么数据就能取到什么数据,所以你这样写和List l1=new ArrayList();效果是一样的,但是List<Integer> l1=new ArrayList();就不一样了

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
个人之见,仅供参考
回复 使用道具 举报
List l1=new ArrayList<Integer>();

l1.add("abc");

l1.add(1);

这个时候引用型变量l1的类型未List,你没有对List做认为限制,所以它可以储存String类型的对象。你要做限定,就要在List那里用泛型!
回复 使用道具 举报
一生一世 发表于 2012-6-14 08:04
兄弟,你这样写有没有泛型都一样,在编译的时候,list中可以存入任意类型的数据,而取出时当做Integer,但 ...

怎么能一样呢?如果什么都没有运行不能通过 我上面的代码编译运行都通过了:(
回复 使用道具 举报
老毕举过一个例子,集合是个容器,你的第一行代码,新生成的ArraList是个装Integer类型的容器,而现在你的List l1不光是ArrayList的父类,同时也没有限定它存储元素的类型。所以Object都可以往里面装。
01.List l1=new ArrayList<Integer>();
02.l1.add("abc");
03.l1.add(1);
我是这么理解的:l1是个和面的盆,new ArrayList<Integer>()是个盛面粉的罐子,里面只能装面粉,然后,你把面粉倒进面盆里,但是面盆里还是可以加水,加鸡蛋,加糖......

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 赞一个!例子很形象!

查看全部评分

回复 使用道具 举报
以下写就可以实现你的要求,安你的写法list只要装入Obj即可 ,至于老师视频中也类似用过,你还是好好看看视频吧,你的写法不一样               
                List<Integer> l1=new ArrayList();

                l1.add("abc");

                l1.add(1);
回复 使用道具 举报
马林康 发表于 2012-6-14 09:43
怎么能一样呢?如果什么都没有运行不能通过 我上面的代码编译运行都通过了 ...

分两方面,第一等号左方叫引用类型,编译器也是针对它来检查的,((Object)"123")这个字符串,你用点是点不出来字符串的方法的。

第二个,范型的本质是在编译期,而实现仍然还是Object,所以你放什么进去都可以。

如果想做约束,只能通过限制左方的引用类型,而不是右侧的实例类型
回复 使用道具 举报
马林康 发表于 2012-6-14 09:43
怎么能一样呢?如果什么都没有运行不能通过 我上面的代码编译运行都通过了 ...

什么都没有是可以通过的,只是编译器会报告警告而已,你这样写一样会有警告,都是一样的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马