1.什么是泛型?
Java泛型是JDK 5中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
2.为什么使用泛型?
2.1 保证类型安全:
在没有泛型之前,集合可以随意插入数据,编译不会报错,但是在我取出来进行类型转换的时候就会报java.lang.ClassCastException 类型转换错误
java.lang.ClassCastException
有了泛型之后,编译的时候就出错了,减少了我们找错误的时间
2.2 消除强制转换:
在不使用泛型的情况下,在给不同类型的变量赋值时,需要强制类型转换
使用泛型的情况下,可以消除强制转换
2.3 避免拆装箱:
没有使用泛型:
public Integer getValue(Object t) {
return (int)t; //拆箱操作
}
使用泛型之后:
public class Test<T> {
public T getValue(T t) {
return t; //不需要拆箱
}
public static void main(String[] args) {
Test test = new Test<Integer>(); //调用方法时指定了类型
}
}
3.泛型的使用
3.1 泛型类:
在开发过程中,在写通用Java类时,经常会用到泛型类,最典型的就是List,Mappublic class 类<泛型> {}
3.2 泛型方法:
public 泛型类型 方法名(泛型类型参数) {}
public T getValue(T t) { //泛型方法
return t;
}
3.2 泛型接口:
public interface 接口名<泛型类型> {}
使用注意
- 泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
- 泛型的类型参数可以有多个。
- 不能对确切的泛型类型使用instanceof操作。如下面的操作是非法的,编译时会出错。
- 不能创建一个确切的泛型类型的数组。
4.泛型通配符
4.1 常用通配符:
T: Type(Java类)
E: Element(元素), 一般用于单列集合
K: Key(键), 与V绑定使用,一般用于双列集合Map
V: Value(值)
N: number(数值类型)
?: 表示不确定类型
4.2 通配符上界:
, 表示存储或传递的值类型只能是E或者E的子类,这里的E代表了泛型的上边界public static void test(List<? extends Father> list) {
}
public static class Father{}
public static class Son extends Father{}
public static void main(String[] args) {
var fatherList = new ArrayList<Father>();
var sonList = new ArrayList<Son>();
test(fatherList);
test(sonList);
}
<p align=left>4.3 通配符上界:</p>
<? super E>, 表示存储或传递的值类型只能是E或者E的父类,否则编译不能通过。这里的E代表了泛型的下边界
4.4 无界通配符:
表示不确定类型,也就是没有边界,可以传递任何类型5.总结
这篇Java泛型就介绍到这里, 本人小白一枚,利用空余时间分享学习知识点,如有错误的地方,欢迎批评指正。