泛型指的是,在定义类,接口和方法时,同时声明了一个或多个变量,如:
将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性。泛型的本质就是参数化类型。
类型
语法解析:
<>是泛型的特征
E表示某种数据类型,也可以用其他字母表示,在实际使用泛型时,需要用明确的类型替换E
作用:在编译阶段避免出现一些非法的数据。
本质:把具体的数据类型传递给类型变量。
好处:简化代码:泛型可以简化代码,避免了使⽤ Object 类型进⾏强制类型转换的繁琐和不安全的操作。
- public class Demo {
- public static void main(String[] args) {
- ArrayList
stringList = new ArrayList<>(); - stringList.add("123");
- String str = stringList.get(0);
- }
- }
泛型类
- public class Demo
{ - private T name;
- public T test01(T name) {
- return name;
- }
- }
泛型接口
- // 这里的TypeList表示的类型参数列表,可以是一个,也可以是多个,多个以逗号隔开。一般是一个大写的
- 字母,比如E
- public interface 接口名
{ -
-
- }
泛型方法
- public <泛型变量, 泛型变量> 返回值类型 方法名(形参列表){
-
- }
定义泛型方法与方法所在的类或者接口是不是泛型类或者泛型接口没有直接的关系,也就是说无论是泛型类还是非 泛型类,只要需要就可以定义泛型方法。
就是对泛型的数据类型进行范围的限制,如三种格式:
>:表示任意类型。
extends 数据类型>:表示是指定数据类型或者它的子类。
super 数据类型>:表示是指定数据类型或者它的父类。
- // ? 代表 Generic 泛型类型是任意类型
- public void test01(Generic> g) {
- }
- // 与泛型方法功能类似
- public
void test04(Generic g) { - }
- // ? 代表 Generic 泛型类型可以是 Super及子类
- public void test(Generic extends SuperFather> g) {
- }
- // ? 代表Generic 泛型类型可以是 Sub及所有父类
- public void test03(Generic super Sub> g) {
- }
泛型只是在编译阶段有效,编译成字节码文件之后就不存在泛型了,这就是泛型擦除。
泛型只支持引用数据类型,不支持基本数据类型。