黑马程序员技术交流社区

标题: 关于泛型的问题 [打印本页]

作者: 马林康    时间: 2012-6-14 06:53
标题: 关于泛型的问题
  1. List l1=new ArrayList<Integer>();
  2. l1.add("abc");
  3. l1.add(1);
复制代码
为什么集合内能传入String对象?
作者: 赵兵锋    时间: 2012-6-14 07:53
  1.                  List l1=new ArrayList<Integer>();//这样写,List中装的类型是Object。
  2.                  List<Integer> l1=new ArrayList<Integer>();//这样写,才能限定List中装的是Integer。
复制代码

作者: 一生一世    时间: 2012-6-14 08:04
兄弟,你这样写有没有泛型<Integer>都一样,在编译的时候,list中可以存入任意类型的数据,而取出时当做Integer,但是编译完成以后,泛型就被去掉了,所以在运行时要取数据的时候,list中有什么数据就能取到什么数据,所以你这样写和List l1=new ArrayList();效果是一样的,但是List<Integer> l1=new ArrayList();就不一样了


作者: 一生一世    时间: 2012-6-14 08:04
个人之见,仅供参考
作者: 李盼    时间: 2012-6-14 08:45
List l1=new ArrayList<Integer>();

l1.add("abc");

l1.add(1);

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

怎么能一样呢?如果什么都没有运行不能通过 我上面的代码编译运行都通过了:(
作者: 黄连兵    时间: 2012-6-14 10:03
老毕举过一个例子,集合是个容器,你的第一行代码,新生成的ArraList是个装Integer类型的容器,而现在你的List l1不光是ArrayList的父类,同时也没有限定它存储元素的类型。所以Object都可以往里面装。
01.List l1=new ArrayList<Integer>();
02.l1.add("abc");
03.l1.add(1);
我是这么理解的:l1是个和面的盆,new ArrayList<Integer>()是个盛面粉的罐子,里面只能装面粉,然后,你把面粉倒进面盆里,但是面盆里还是可以加水,加鸡蛋,加糖......
作者: 武剑峰    时间: 2012-6-14 11:03
以下写就可以实现你的要求,安你的写法list只要装入Obj即可 ,至于老师视频中也类似用过,你还是好好看看视频吧,你的写法不一样               
                List<Integer> l1=new ArrayList();

                l1.add("abc");

                l1.add(1);
作者: 刘蕴学    时间: 2012-6-14 11:20
马林康 发表于 2012-6-14 09:43
怎么能一样呢?如果什么都没有运行不能通过 我上面的代码编译运行都通过了 ...

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

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

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

什么都没有是可以通过的,只是编译器会报告警告而已,你这样写一样会有警告,都是一样的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2