文章目录
1、泛型的作用
泛型:允许在定义类、接口时指定类型形参,这个形参健在声明变量、创建变量的、创建对象的时候再确定的(即传入的实际参数类型,也可以称为类型实参)
泛型出现的版本
泛型出现的原因(即为什么要有泛型)
在jdk1.5之前,集合类像ArrayList、LinkList、Set存放的Object类型的,无法对存入的元素进行自检查,在取数据的需要对数据的强制转换,如果一旦集合中存入了不一致的类型,例如存放integer类型的集合中错误存放String类型,就会出现类型转化错误的异常
使用泛型的原因:
当我们从泛型类的对象中取出值的时候,如果不使用泛型需要的步骤是:
- 获取到 Object 类型的值
- 将 Object 类型的强制转换为 对应的类型,才能使用该类型的相关方法
使用泛型的好处:
- 获取到泛型指定的类的值,(这里我们不用进行强转,这一步骤交给了虚拟机,即 JVM 会帮我们转换为指定的类)
从上面的步骤看:我们减少了泛型的强转工作
public static void main(String[] args) {
List objectList = new ArrayList();
// 存数据
objectList .add(5);
objectList .add(6);
objectList .add("我是一个字符");
//取出数据
for(int i=0;i<objectList.size();i++){
// 在取出前两个的时候可是正常
//在获取字符的时候,会出现ClassCastException异常,因为这里把强制转化成了Integer类型的
Integer element = (Integer )objectList.get(i);
System.out.println("正在取出第"+i+"元素:"+element);
}
}
在main方法中执行上面的语句会出现这样的异常
在jdk1.5之后,使用了泛型之后在上面的代码中片段使用泛型声明了intList是Integer类型的,在编写阶段就进行检查,intList.add(“我要插入一个字符串”); 这里插入的是一个字符串,无法通过编译。
public static void main(String[] args){
// 这是jdk7之前的写法
List<Integer> intList = new ArrayList<Integer>();
// 这是jdk7之后的写法,因为jdk7 的新特性类型推断
List<Integer> intList = new ArrayList<>();
// 可以通过编译的
intList.add(5);
intList.add(6);
// 不能通过编译的,在编写阶段就会报错的
intList.add("我要插入一个字符串");
}
上面的方法在编译阶段就报错,说明集合要求的是Integer类型,传入的是字符串类型
上面如何使用泛型
2、泛型的使用
常见的泛型主要作用在普通类
2.1、定义泛型接口、泛型类
定义泛型接口:
常用 T
、K
、V
等大写的字母去表示泛型,就可以在整个类中将 T
、K
、V
当作一种类型去使用,可以用于成员变量的定义、返回值、形参上使用
从List
、Iterator
、Map
的定义来看如何定义一个泛型接口
// 定义接口时指定了一个类型参数,参数名用E表示
// List接口
public inteface List<E>{
void add(E data);
// 这里使用了下面的泛