黑马程序员技术交流社区

标题: 集合和泛型 [打印本页]

作者: 安鹏宇    时间: 2013-3-25 21:06
标题: 集合和泛型
本帖最后由 安鹏宇 于 2013-3-26 12:58 编辑

关于集合和数组,他们最大的区别就是
数组的长度是固定的,只能存单一类型的数据
集合长度不固定,而且可以存储不同类型的数据,
既然集合可以存储不同类型的数据是它的一个特点和不同,为什么
使用时还要加上泛型,我知道加泛型方便使用,不容易出错,
但是可以存储多种类型,泛型,这两者不是矛盾了吗。。。
作者: 莫道荣    时间: 2013-3-25 21:14
有泛型是为了明确里面的类型,避免装箱拆箱,提高安全性,试想一下要是不限类型那么里面就得定义object类型,你存进去就装箱了,而且你装了n多种类型进去,取出来的时候你就得转换就拆箱了,而且你要是一大堆类型的里面你取出来的时候你还知道哪个是什么类型吗??一转不就容易出错了
作者: IT菜鸟    时间: 2013-3-25 21:18
引入泛型,当然有泛型的 好处。主要如下:

1,类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。

2,消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。

3,潜在的性能收益。 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。


Java语言引入泛型的好处是安全简单。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
    泛型在使用中还有一些规则和限制:
    1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
    2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
    3、泛型的类型参数可以有多个。
    4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上成为“有界类型”。
作者: 安鹏宇    时间: 2013-3-25 21:26
莫道荣 发表于 2013-3-25 21:14
有泛型是为了明确里面的类型,避免装箱拆箱,提高安全性,试想一下要是不限类型那么里面就得定义object类型 ...

恩,我的意思是既然泛型安全性高用着更方便,为什么集合在一开始定义时就不定义成和数组一样只能装单一类型的对象呢?
作者: 黄玉昆    时间: 2013-3-26 12:33
安鹏宇 发表于 2013-3-25 21:26
恩,我的意思是既然泛型安全性高用着更方便,为什么集合在一开始定义时就不定义成和数组一样只能装单一类 ...

这就是为什么要出现泛型的原因了,通过泛型就将集合类型再次具体化了,你开始定义一个集合,如
ArrayList al = new ArrayList();
那么,你可以添加任意的Object类型值,如果你用泛型,就是再进一步确定你要存储的类型,以及不允许别人存入非指定类型。

我想这个你已经明白了, 再来说为什么不在一开始定义成和数组一样的只装单一类型的对象。
对于数组,你使用[]来指定是数组类型的,其实你可以这样理解,<>和[]是一个道理的,都是在限定类型。那么,你说这不就是在一开始定义好的吗?
作者: 安鹏宇    时间: 2013-3-26 12:57
黄玉昆 发表于 2013-3-26 12:33
这就是为什么要出现泛型的原因了,通过泛型就将集合类型再次具体化了,你开始定义一个集合,如
ArrayList ...

蒽,明白了,谢谢,,,




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