本文都是干货,一些理论上东西我尽可能一笔带过,只写有用的内容。
本篇目录
1- 泛型是什么 2- 泛型的作用 3- 泛型的定义 4- 泛型的使用
1 泛型是什么
如下代码是一个使用了泛型的实体类,E
表示这里类型使用的了泛型,意思是可以为任意类型,也包括引用数据类型。
public class Test<E> {
private E test;
public Test(E test){
this.test=test;
}
public E getTest(){
return this.test;
}
}
2 泛型的作用
在增加泛型之前,泛型相关程序是使用继承实现。因为我们知道Object是所有类的父类,也就是说所有类都继承了Object。所以在泛型之前是将参数和域的类型定义为Object,通过强制类型转换也能达到我们的目的。
但是由于这种程序设计我们无法提前预测数据的类型,也就导致了可以多类型的数据交互,而产生后续强制数据类型转换时无法确定该数据的类型。
在使用类型参数后,编译器就可以检测提供的数据类型是否错误,使程序具有更好的可读性和安全性。
List list=new ArrayList();
list.add(1);
list.add("测试");
在如上代码中,我没有指定泛型的类型,但是程序依然可以运行,并且无任何异常;可在将数据读出来后,我们无法判断该数据的具体类型,如果将一个String类型的数据强制赋值给Integer则会报错。
3 泛型的定义
定义泛型需要在类名或接口名后指定泛型,格式如:
public class Test<E>{}
这里的大写英文字母并不是必须是E
,但在开发规约中,泛型一般使用E、K、V、T来定义泛型。
4 泛型的使用
定义了泛型后,可在类中代码中即可使用该字母作为数据类型来定义变量。
public class Test<E>{
public E test;
}
从如上代码中你知道test变量是一个什么类型吗,显然现在无法回答,因为我们没有对它进行初始化,没有对它进行赋值。
Test<String> t=new Test<>();
现在我对它进行了初始化,将泛型E赋予了String类型,所以现在类中的test变量就是String类型。
看到这里你们有没有觉得它很熟悉,好像我们在开发中哪里见到过。没错,Java的很多地方都大规模的使用了泛型,接触最多就是集合框架中泛型,如:
List<String> list=new ArrayList<>();
这是我们在初始化一个ArrayList实例对象,并且指定了它的泛型为String类型,也就是说我们接下来要在List中添加元素的话,只能添加String类型,添加其它的类型元素则会报错。