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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

学到集合和泛型,产生一个小疑惑。视频说集合可以存放任何对象的引用。那么
例如,ArrayList  al  = new ArrayList();
         al.add(人);
         al.add(字符串);
         al.add(new Integer(3));
请问这样的话可以吗,如果不可以那在这个集合就用不了泛型了??

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

11 个回复

正序浏览
    啊,集合与数组最大的区别就是:1、集合没有长度是限制;2、集合可以存放任意的对象,且只能存放对象。
集合完全可以add一个Person,在add一个Demo,但是需要注意的是集合的记忆性不大好,存进去的对象统统的被向上
转型为Object,在取出的时候再根据其对象本身的类型进行强制转换,比如,Person p = (Person)obj1, Demo d = (Demo)obj2
所以,集合是可以存放任意对象的。
    但是呢,在泛型技术出现后,如果我们在定义集合的时候用了泛型进行类型的限定,那么此时的集合就有点像数组了,只能存入
泛型限定类型的对象了,比如 List<Person> list =new ArrayList<Person>(),list集合就只能存Person对象了。
回复 使用道具 举报
本帖最后由 黄成超 于 2013-2-7 22:37 编辑

集合存放任意对象的引用,这句话时正确的。因为集合的出现,就是为了封装对象的需要。注意,这里说的是对象的引用,并不是说什么都可以往里面放!在jdk1.5之前,基本数据类型的对象是无法存放基本数据类型的。1.5之后,java自动拆装箱机制的出现,才使得int型的数据可以存放在集合中,但是这个还是因为出现了类型转化的原因。所以,集合中存放任意对象的引用没错,关键是弄清楚存放的是否为对象的引用!
泛型的出现只是说可以使同一个集合中存放的对象多种类型的对象,前提是对象。而且,jdk1.5之后,对于规范的编码,还要求拥有同一接口的类对象

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
ying 中级黑马 2013-2-6 18:32:59
9#
泛型是JDK1.5的一个新特性,在你用的这个集合中并没有用到泛型。
我们先理解一下什么是泛型,通俗一点说泛型就是用来规范数据的类型的,使得一个集合中存放相同类型的数据,统一数据的类型;在定义集合时你可以为此集合定义一个数据类型,
在此集合中只能存放这种类型的数据,如果添加其他的数据则编译器会报错,因此泛型起到了一个规范数据类型的作用,其实这么说也不全对,因为泛型只是让编译器看的,在运行期间就没有泛型这个规范了;
你这个列子可以这么写:
  1. Collection<String> al = new ArrayList<String>();
  2. al.add("人");
  3. al.add("字符串");
  4. al.getClass().getDeclaredMethod("add", Object.class).invoke(al, new Integer(1));
  5. System.out.println(al.size());
复制代码
打印的结果为3,所以说泛型是用来规范数据类型的,这句话并不准确,泛型对规范数据类型起到一定的作用,

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
所谓的集合可以存放任何对象的引用,其实就是存放“Object”类型的对象,
而Object类下面又有很多子类,如:Integer、Strign、File等,所以就像你上面所写的那样,
虽然你存放了很多不同类型的对象,当从其最上面的顶层类来看,其实存的都是Object类型的对象,
由于Object是所有类的父类,所以集合只要可以存放Object类型的对象也就可以“存放任何对象的引用了”。

而对于泛型的出现,其实就是为了弥补集合这种特性的缺点而出现的,当对集合中的数据进行操作要用到
一些对象特有的方法时,如果集合中的所有对象并非都拥有此方法,就会出现错误,所以当泛型的出现
限制了集合中存放对象的类型时,就避免了这一不安去因素。而且泛型的另一个特点就是避免了
强转的麻烦!

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
我的理解是:
这个是可以的
首先来说泛型时面向编译器的,用泛型的好处是不用再频繁的类型转换
其次,用泛型的好处在于能够及时的发现错误,即在编译阶段就找到可能引起错误的地方
最后,正如楼上所说可以通过反射来为定义的泛型类型的集合添加其它元素,这也印证了泛型时面向编译器的
回复 使用道具 举报
又看到这个问题了,俺是来捣乱滴!
就算你定义了泛型,俺也能往里面乱加东西,你管不住滴,嘿嘿!{:soso_e144:}
反射,你学反射了么,试试反射就知道咯。
泛型只在编译期检查,过了编译俺还怕你么
回复 使用道具 举报
先说楼主的问题:
楼主这么写是可以的,在你定义ArrayList的时候,是没有定义泛型的,所以在集合中存放的是对象就可以

在集合中使用泛型的原因就是要来规范集合中存放的元素。
当你在定义集合的时候规范了集合的类型,那么在你的集合中只能存放泛型类型的元素。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
这个可以。在没有泛型出现之前,都是使用这种方式的,add方法的参数类型是Object
如果你用了泛型,就不行了,使用了泛型,那么就只能加入泛型规定的类型的对象
如:
ArrayList<String>  al  = new ArrayList<String>();
al.add(字符串);
al.add(字符串);
al.add(字符串);

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
泛型在jdk1.5才有这个概念,在1.5之前,集合ArrayList就是这样用的。
它在存的时候虽然方便,什么都可以往里存,也没有什么要求。
但有一个不好的地方就是在取的时候麻烦,经常需要强转。
这样1.5为了解决这个问题就提出了泛型ArrayList<T>,常规的我们只能存入T类型的元素,否则编译器报错。
那样就免去了我们强转的麻烦,同时一个集合存放着多种类型的数据也是不便于管理的。
注意:泛型在编译过后会去泛型化,这个叫拭擦,泛型这个T只是给编译器用的。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

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