为什么需要泛型
Java引入泛型的主要解决的问题有两个:减少代码错误和代码复用。
减少代码错误
集合在使用时只接受指定类型(示例类型为String)的对象时,如果不使用泛型在运行的时候才会暴露出错误。示例如下:
为了解决上面的问题,Java引入了泛型,泛型会在编译时期就对添加的元素进行检查,如果类型不匹配,在编译的时候就会暴露出问题。示例如下:
代码复用
假设有2个需求:
- 接收String类型的数组,颠倒数组中所有元素。
- 接收Integer类型的数组,颠倒数组中所有元素。
在JDK1.5之前,实现上述两个需求我们需要写以下两个方法:
public static void reverses(String[] arr1) {
for (int i = 0; i < arr1.length / 2; i++) {
String temp = arr1[i];
arr1[i] = arr1[arr1.length - i - 1];
arr1[arr1.length - i - 1] = temp;
}
}
public static void reverses(Integer[] arr1) {
for (int i = 0; i < arr1.length / 2; i++) {
Integer temp = arr1[i];
arr1[i] = arr1[arr1.length - i - 1];
arr1[arr1.length - i - 1] = temp;
}
}
在JDK1.5之后,实现上述两个需求只需要写一个方法:
public static <T> void reverses(T[] arr1) {
for (int i = 0; i < arr1.length / 2; i++) {
T temp = arr1[i];
arr1[i] = arr1[arr1.length - i - 1];
arr1[arr1.length - i - 1] = temp;
}
}
显而易见,使用泛型可以提高代码的复用性。
如何使用泛型
- 泛型方法(Generic Methods):
- 声明方式:写在返回值之前
- 语法示例:
public <T> void genericMethod(T value) {}
- 使用方式:在调用泛型方法时,可以明确指定实际的类型参数,也可以通过类型推断自动推导
- 泛型类(Generic Classes):
- 声明方式:在类名后面使用尖括号(<>)定义泛型参数
- 语法示例:
public class GenericClass<T> {}
- 使用方式:在创建泛型类的实例时,可以明确指定实际的类型参数,也可以通过类型推断自动推导
总结:
- 需要注意的是,泛型方法和泛型类可以同时使用,即在泛型类中可以定义泛型方法,而且泛型方法的类型参数可以与泛型类的类型参数不同。
- 另外,泛型方法和泛型类可以搭配使用,例如在泛型类中定义泛型方法,或在泛型方法中使用泛型类作为参数或返回类型。
- 使用泛型方法和泛型类可以使代码更加通用和灵活,能够处理不同类型的数据,提高代码的可复用性和类型安全性。
什么是泛型
我记忆泛型的方法是:泛可以理解为通用,型就是类型。所以泛型也可记为通用的类型。
泛型擦除
泛型在编译之后,就消失了,它是JDK的语法糖。另外JVM是感知不到泛型的存在的,在.java -> .class文件的过程中,泛型就被编译成具体的类型。