JAVA-初步认识-常用对象API(集合框架-泛型-概述)
一.
学习一下,使用集合过程中,所涉及的JDK1.5以后所发生的技术,叫做泛型。可以从字面直译,广泛的类型。
首先介绍一下泛型的由来,技术的由来是为了解决问题的。
之前在讲述集合时,演示了很多小示例,现在在这些的基础上,阐述泛型的概念。
例子中为什么要强转?因为add方法它的类型是object,这个方法在定义的时候是object类型,public boolean add(object obj)。object什么类型的对象都能接收进来,而且被提升为了object,取出来肯定也是object。这个说完以后,说一个特殊的现象。
al.add(4);其实做的是al.add(new Integer(4));操作,
结果出现了问题,强转失败。Integer不能转化为String,怎么解决这个问题?
有人说要判断,但是里面有很多类型,挨个判断不合适。还有,如果指定的参数al的集合是别人传递来的,那根本就无法进行判断,人家往里面装什么了,我们不知道。下面就要解决这个问题。先交代一下,之前是怎么解决的。之前的方式很简单,由程序员主观控制。什么叫主观控制,跟你讲里面要存,必须存储同一类型的,要么都是String,要么都是Integer。这带来了一些隐患,编译没事,运行出事了,用户那边存储的出了问题,他不清楚类型是什么,出了问题没法解决。因此,后期1.5以后提供了一些解决方案。
它的解决思想和数组是一致。
现在就数组讲述一下,写成9是可以的,写成9.0是否可以呢? 有人说不行,定义的数组是int类型,而9.0是浮点型。数组也是容器,在声明时就确定了里面元素的类型,必须是int。写成9.0是不可以的。基于这点,al也是容器,为了避免后期出现安全隐患,在定义容器的时候,就明确里面装什么类型的元素。
那么该怎么修改程序。
由于是要定义集合,那么在定义时要明确一下,集合中要存储什么类型的元素。书写格式如下,
回过头来看上面就知道为什么出错了,4的类型不对,编译时出错。
编译的时候,会检测类型。因为java是强类型语言,它对每一个数据都确定了具体的类型,只要不匹配,立马编译失败。不用到运行那步,编译时期就失败了。
集合中确定了元素类型为String,那么来自集合的迭代器也要交代其取出的元素是什么类型。最终,it.next前面不需要进行强转了,因为类型已经明确好了。
修改完整的程序如下,
这个集合中指定的类型就是泛型,对操作的类型进行指定。
泛型的出现是解决问题的,integer在1.5以后出现的自动装箱拆箱是解决简化问题的。在1.5出现一个安全机制,或者叫安全新特性,这是为了提高安全性而出现的。简化书写,提高效率,提高安全性。
那么,尖括号到底什么时候用?现在先说已有的情况,然后再说自定义的情况。
尖括号是用来接收类型的,比如说之前学习到了utill包中的arraylist,它后面就有尖括号,E是指参数。
有人说,一个参数写成e就可以,至于写成E么。这里接收的都是引用数据类型,引用数据类型不是类就是接口,或者数组。类或接口首字母大写。
E是参数,我们不知道ArrayList中要装入什么参数,所以我们这边提供一个类型变量,要用什么往里面传递就好了。
早期没泛型的情况下,是object。(泛型可能就是指未知参数)所以,它有一个自动类型提升,就是向上转型,取的时候,还要向下转型。这就是我们说的强制转换。
目前介绍了泛型的尖括号基本使用说了一下。接口也是一样,如下图所示。
看下图,API中写成e1,e2的形式,是说e1是用来接收类型的,在具体使用中会交代的。只要看大尖括号,就往里面传递类型。