您的位置:首页 > 编程语言 > Java开发

从ArrayList看Java泛型

2016-06-12 17:58 429 查看

从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_
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 源码 泛型 arraylist