# 第四章第三节--1泛型
标签(空格分隔): 廖雪峰
---
## 为什么要使用泛型
例子:JDK提供的`ArrayList`,可以看做是一个可变的数组,其特点为比数组操作起来更方便.
![ArrayList例子](http://p0b921qfc.bkt.clouddn.com/18-5-18/42287307.jpg)
在`ArrayList`的内容是使用一个`Object[]`数组来存放所有的数据,当不实用使用泛型直接来存储`String`类型的时候,在代码中需要进行强制转型,如下图所示,这样写代码的时候就很不方便,容易出现错误,在打印的时候也无法统一执行.
![不是泛型](http://p0b921qfc.bkt.clouddn.com/18-5-18/62922144.jpg)
若为每种`Object`都单独的编写一个`ArrayList`,这样便不用强制转型.可是这样一来就需要对于每种不同的类型都重新构建一个`Arraylist`,JDK中原本的数据类型就有上千种,所以这种方法也是不可行的.
![重写IntegerArrayList](http://p0b921qfc.bkt.clouddn.com/18-5-18/33992402.jpg)
最好的思路便是重用一套代码,把数据类型作为参数的形式传递进去.这边是泛型的雏形了.
这样就可以实现编写一次代码,实现各种类型的`ArrayList`.
![泛型](http://p0b921qfc.bkt.clouddn.com/18-5-18/24897619.jpg)
## 什么是泛型
泛型就是一种模版,例如`ArrayList<T>`
- 在代码中为用到的类创建对应的`ArrayList<类型>`代码表示为`ArrayList<String> list = new ArrayList<String>()`;
- 编译器将对这种类型做检测,`list.add("hello");list.add(123);//complie error.`
## 泛型的继承关系
`ArrayList<T>`实现的是`List<T>`接口,我们可以向上转型.
![向上转型](http://p0b921qfc.bkt.clouddn.com/18-5-18/3334175.jpg)
注意:`ArrayList`可以向上转型为`List`,不过`ArrayList<Integer>`不能向上转型为`ArrayList<Number>`/`List<Number>`
![object不能向上转型的原因](http://p0b921qfc.bkt.clouddn.com/18-5-18/3334175.jpg)
如果把`ArrayList<Integer>`向上转型为`ArrayList<Number>`,那么就可以添加`float`类型,如果添加`float`类型之后,打印的时候便又出现类型不能确定的问题,导致出错.
## 小节小结
- 泛型就是编写模版代码来适应任意类型.(把类型按照参数的形式传出去)
- 不必对类型进行强制转换.
- 编译器在添加的时候便对元素进行检查.
- 注意泛型的继承关系.可以把`ArrayList<T>`向上转型为`List<T>`,不能把`ArrayList<T>`向上转为`ArrayList<T的父类>`或者`List<T的父类>`
- 前言
- 一:Java快速入门
- 二:Java面向对象编程
- 三:Java异常处理
- 错误处理
- Java的异常
- 捕获异常
- 抛出异常
- 自定义异常
- 断言和日志
- 使用断言
- 使用JDK Logging
- 使用Commons Logging
- 使用Log4j
- 四:Java反射与泛型
- 反射
- Class类
- 访问字段
- 调用方法
- 调用构造方法
- 获取继承关系
- 注解
- 使用注解
- 定义注解
- 处理注解
- 泛型
- 什么是泛型
- 使用泛型
- 编写泛型
- 擦拭法
- extends通配符
- super通配符
- 泛型和反射
- 五:Java集合
- Java集合简介
- Java集合简介
- List
- 使用List
- 编写equals方法
- Map
- Set
- Queue
- Stack
- 最佳实践
- 六:Java IO编程
- 七:Java处理日期和时间
- 八:JUnit单元测试
- 九:Java正则表达式
- 十:Java加密与安全
- 十一:Java多线程编程
- 十二:Maven基础
- 十三:Java网络编程
- 十四:Java操作XML和JSON
- 十五:Java JDBC编程
- 十六:Java函数式编程