Java八股(泛型)

什么是泛型

泛型是 Java 编程语言中的一个重要特性,它允许类、接口和方法在定义时使用一个或多个类型参数,这些类型参数在使用时可以被指定为具体的类型。

泛型的主要目的是在编译时提供更强的类型检查,并且在编译后能够保留类型信息,避免了在运行时出现类型转换异常。

为什么需要泛型

如果存在一段方法相同,只是参数类型不同的代码则会出现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static int add(int a, int b) {
System.out.println(a + "+" + b + "=" + (a + b));
return a + b;
}

private static float add(float a, float b) {
System.out.println(a + "+" + b + "=" + (a + b));
return a + b;
}

private static double add(double a, double b) {
System.out.println(a + "+" + b + "=" + (a + b));
return a + b;
}

可以发现,上述代码都是实现了a+b这个逻辑,但是根据传入的参数类型不同和返回值类型不同,我们不得不写成三个add方法。这里涉及了方法的重载,由虚拟机来更具传入的类型来分辨到底属于哪一个方法。

但是有了泛型,我们就可以将这三个方法整合为一个:

1
2
3
4
private static <T extends Number> double add(T a, T b) {
System.out.println(a + "+" + b + "=" + (a.doubleValue() + b.doubleValue()));
return a.doubleValue() + b.doubleValue();
}

使用泛型进行类型检查

当我们创建一个list集合:

1
2
3
4
List list = new ArrayList();
list.add("xxString");
list.add(100d);
list.add(new Person());

应为List集合的默认元素都是Object类型,所以不管什么String还是double类型还是具体的对象,都可以存到list中,由此我们可以发现如果我们希望这个list是一个特定类型的list就必须要对其中的元素做约束:

1
2
3
List<String> list = new ArrayList<String>();

// list中只能放String, 不能放其它类型的元素