从ArrayList看Java泛型,ArrayListJava泛型
从ArrayList看Java泛型,ArrayListJava泛型
从ArrayList看Java泛型
一、知识点
1、Java 泛型
2、Java 多态
3、Java ArrayList源码
二、个人理解
1、泛型更形式面向对象思想多态的扩展,它的使用范围更多的针对于类类型的参数、方法参数、方法返回值等等,它可以让程序的代码更简洁、减少你程序里面因为类型不匹配,在进行显示转换的时候,导致的类型强制转换错误。说泛型是“通配”作用,我更喜欢用“限定范围”这个词来描述Java泛型的妙用,注意Java的泛型是在JDK1.5之后引入的,不过目前这个都升级到1.8了,还有人用1.5么。。。
2、在Java中泛型的使用,最常用的应该是集合类型Collection下的子类。例如ArrayList;下面我们进入到ArrayList源码中来查看其中是如何利用Java泛型的。
<1>知识点:Java的泛型作用范围主要是Class、Fouction、Params、Var等等。例如ArrayList中:
(1)作用于类:public class ArrayList<E> extends AbstractList<E>
(2)作用于方法:public E get(int index)/
public ArrayList(Collection<? extends E> c)(构造方法)
(3)作用于参数:public <T> T[] toArray(T[] a)
(4)作用于变量的在这没有具体体现,但是跟参数的样子类似
NOTE:这里的E和T都是一种泛型的类型名称,代表的是一种类类型(不可以基本数据类型哦),可以是任意符合JAVA命名规范的,通常用单个字符标示根据代表性。
<2>知识点:通配符,相比大家都注意到了上面作用于方法中的那个构造方法中的?吧,没错这就是通配符,在构造方法里面的作用是用来初始化ArrayList方法,限定的范围是包含E类型(含子类)的Collection对象,在ArrayList的类对象限制中E并没有明确指出限制条件,其父类也未曾有任何限制,则默认E的范围是Object类型。这下你就可以理解ArrayList<String>\ArrayList<Integer>等等的限定作用了吧。因为泛型是运行时判断的,所以编译时所有的添加操作都是不允许的,因为编译时候,虚拟机无法确定你添加的内容和已有集合的数据类型一致,所以默认情况下使用通配符虚拟机只允许你从内容里面读取,但是我们使用ArrayList的时候增删改查都可以使用呀,这是什么原因呀,这是我查到的总结的比较好的通配符使用方法,直接搬过来吧:
<!--[if !supportLists]-->l <!--[endif]-->如果你想从一个数据类型里获取数据,使用 ? extends 通配符
<!--[if !supportLists]-->l <!--[endif]-->如果你想把对象写入一个数据结构里,使用 ? super 通配符
<!--[if !supportLists]-->l <!--[endif]-->如果你既想存,又想取,那就别用通配符。
<3>上面所说的限定会引出今天的第三个知识点,范围的限定:向上限定向下限定。向上限定 ? Super ClassName、向下限定 extends和&符号。
三、扩展
<1>不知道大家注意到上面的ArrayList里面这个对象数组了没。
/**
* The array buffer into which the elements of the ArrayList are stored.
* The capacity of the ArrayList is the length of this array buffer. Any
* empty ArrayList with elementData == EMPTY_ELEMENTDATA will be expanded to
* DEFAULT_CAPACITY when the first element is added.
*/
private transient Object[] elementData;
这个对象数组里面存储的就是我们存放到数组里的String、Integer等等对象,最终都会转换当做对象存放在该数组内,这个就是核心装换方法,增删改查都需要该方法的处理,看到他做了什么事情么对的没错他做了强制转换:
// Positional Access Operations
@SuppressWarnings("unchecked")
E elementData(int index) {
return (E) elementData[index];
}
四、总结
<1>泛型是减少代码提高兼容性的利器,运行时决定制定的类型,很有帮助,最近正在封装一个Android网络请求类,会将泛型添加到里面,到时再讲代码添加关联过去吧。
<2>关于Java泛型可查阅的链接:
http://qiemengdao.iteye.com/blog/1525624
http://baike.baidu.com/link?url=w3zHod0oIorQFw-IF3ikAnYL5km2OurJDki73FAybtejknKZ135EKy0xCauxpPkWMcgiJHd-T4sX4gY3s_yym_
相关文章
- 暂无相关文章
用户点评