java泛型详解

89 阅读2分钟

1.什么是泛型?

Java泛型是JDK 5中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

2.为什么使用泛型?

2.1 保证类型安全:

在没有泛型之前,集合可以随意插入数据,编译不会报错,但是在我取出来进行类型转换的时候就会报java.lang.ClassCastException 类型转换错误

image.png

java.lang.ClassCastException

image.png 有了泛型之后,编译的时候就出错了,减少了我们找错误的时间

image.png

2.2 消除强制转换:

在不使用泛型的情况下,在给不同类型的变量赋值时,需要强制类型转换

image.png 使用泛型的情况下,可以消除强制转换

image.png

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,Map
public class 类<泛型> {}

image.png

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代表了泛型的下边界

image.png

图示代码中的test方法接收的参数只能是Father类和他的父类,传入Son,编译就会报错

4.4 无界通配符:

表示不确定类型,也就是没有边界,可以传递任何类型

5.总结

这篇Java泛型就介绍到这里, 本人小白一枚,利用空余时间分享学习知识点,如有错误的地方,欢迎批评指正。