一、为什么使用泛型
泛型的好处:
Java引入泛型有以下好处:
1. 类型安全
- 好处:在编译阶段就能检查出类型不匹配的错误,避免了运行时因为类型错误导致的异常,增强了程序的健壮性。
- 例子:考虑一个存储学生成绩的列表。如果不使用泛型,可能会错误地将非成绩数据放入列表。
2. 代码复用性
- 好处:可以编写通用的代码,使其适用于多种不同类型,减少代码重复。
- 例子:定义一个通用的容器类,用来存储和获取两个对象。
3. 提高代码可读性
-好处: 泛型能够清晰地表明代码所处理的数据类型。例如, List<String> 一看就知道这个列表是专门用于存储字符串的。这比没有泛型时,需要查看代码中的添加和获取元素的操作才能猜测列表中存储的元素类型,要直观得多。
// 不使用泛型,参数类型是Object数组
public static void swap(Object[] array, int i, int j) {
Object temp = array[i];
array[i] = array[j];
array[j] = temp;
}
// 使用泛型,明确参数是T类型的数组
public static <T> void genericSwap(T[] array, int i, int j) {
T temp = array[i];
array[i] = array[j];
array[j] = temp;
}
// 使用示例
Integer[] intArray = {1, 2};
// swap((Object[])intArray, 0, 1); // 调用不使用泛型的方法,需要强制转换
genericSwap(intArray, 0, 1);
// 调用使用泛型的方法,更直观,一看就知道是处理整数数组
System.out.println(intArray[0] + " " + intArray[1]);
4. 符合面向对象编程的理念
- 好处:能够更好地处理不同类型的数据,就像多态一样,可以对不同类型的数据进行通用的操作,提高了程序的灵活性和扩展性。
- 例子:设计一个简单的打印方法,能打印不同类型的数组。
// 打印整数数组
public static void printArray(int[] array) {
for (int i : array) {
System.out.print(i + " ");
}
System.out.println();
}
// 打印字符串数组
public static void printArray(String[] array) {
for (String i : array) {
System.out.print(i + " ");
}
System.out.println();
}
// 使用泛型实现通用的打印方法
public static <T> void genericPrintArray(T[] array) {
for (T i : array) {
System.out.print(i + " ");
}
System.out.println();
}
// 使用示例
int[] intArray2 = {3, 4};
String[] stringArray = {"a", "b"};
printArray(intArray2);
printArray(stringArray);
genericPrintArray(intArray2);
genericPrintArray(stringArray);
语法使用问题:
1.<T> 写在方法后面,声明这是一个泛型方法
正确使用泛型:
public static T removeLast(Stack<T> stack)
public static <T> T removeLast(Stack<T> stack) 这两种写法的区别在哪
正确使用泛型类: