导入
泛型简介
在本节课中,将介绍如何开始使用 Java 中的泛型方法(函数)。
🔍 定义
“泛型允许代码的重用,使得一个单一的方法可以用于不同数据类型的变量或对象。”
其核心思想是,允许 Integer、String 等引用类型以及用户自定义类型作为方法、类和接口的参数。
例如,HashSet、ArrayList、HashMap 等类都很好地使用了泛型。我们可以将它们应用于任意类型。
以下示例展示了三个非泛型(类型敏感)函数,用于找出三个输入中的最大值:
1class Main { 2 public static void main(String[] args) { 3 System.out.printf("最大值:%d, %d, %d 的结果是 %d\n\n", 3, 4, 5, 4 MaximumTest.maximum(3, 4, 5)); 5 System.out.printf("最大值:%.1f, %.1f, %.1f 的结果是 %.1f\n\n", 6.6, 8.8, 7.7, 6 MaximumTest.maximum(6.6, 8.8, 7.7)); 7 System.out.printf("最大值:%s, %s, %s 的结果是 %s\n", "pear", "apple", "orange", 8 MaximumTest.maximum("pear", "apple", "orange")); 9 } 10} 11 12class MaximumTest { 13 // 找出三个 int 值中的最大值 14 public static int maximum(int x, int y, int z) { 15 int max = x; // 假设 x 最初是最大的 16 17 if (y > max) { 18 max = y; // y 目前最大 19 } 20 21 if (z > max) { 22 max = z; // z 现在最大 23 } 24 return max; // 返回最大值 25 } 26 27 public static double maximum(double x, double y, double z) { 28 double max = x; // 假设 x 最初是最大的 29 30 if (y > max) { 31 max = y; // y 目前最大 32 } 33 34 if (z > max) { 35 max = z; // z 现在最大 36 } 37 return max; // 返回最大值 38 } 39 40 public static String maximum(String x, String y, String z) { 41 String max = x; // 假设 x 最初是最大的 42 43 if (y.compareTo(max) > 0) { 44 max = y; // y 目前最大 45 } 46 47 if (z.compareTo(max) > 0) { 48 max = z; // z 现在最大 49 } 50 return max; // 返回最大值 51 } 52}
这三个方法功能完全相同,但由于使用了不同的数据类型(int、double 和 String),无法合并为一个方法。
泛型方法
要使用泛型方法,需采用如下语法:
语法
1<T> void MyFirstGenericMethod(T element)
T 是我们指定的泛型数据类型名称,当调用该方法时,T 就如同一个类型别名(typedef)代表具体的类型。
下面的例子展示了如何使用模板编写 maximum 方法:
1class Main { 2 public static void main(String[] args) { 3 System.out.printf("最大值:%d, %d, %d 的结果是 %d\n\n", 3, 4, 5, 4 MaximumTest.maximum(3, 4, 5)); 5 System.out.printf("最大值:%.1f, %.1f, %.1f 的结果是 %.1f\n\n", 6.6, 8.8, 7.7, 6 MaximumTest.maximum(6.6, 8.8, 7.7)); 7 System.out.printf("最大值:%s, %s, %s 的结果是 %s\n", "pear", "apple", "orange", 8 MaximumTest.maximum("pear", "apple", "orange")); 9 } 10} 11 12class MaximumTest { 13 // 找出三个 Comparable 对象中的最大值 14 public static <T extends Comparable<T>> T maximum(T x, T y, T z) { 15 T max = x; // 假设 x 最初是最大的 16 17 if (y.compareTo(max) > 0) { 18 max = y; // y 目前最大 19 } 20 21 if (z.compareTo(max) > 0) { 22 max = z; // z 现在最大 23 } 24 return max; // 返回最大值 25 } 26}
具有多个类型参数的泛型方法
在上述代码中,maximum() 方法的所有参数必须是相同类型。
当然,也可以定义包含多个类型参数的泛型模板,语法非常简单。例如,对于包含三个类型参数 T1、T2 和 T3 的模板,可写为:
1class Generics { 2 public static <T1, T2, T3> void temp(T1 x, T2 y, T3 z) { 3 System.out.println("这是 x = " + x); 4 System.out.println("这是 y = " + y); 5 System.out.println("这是 z = " + z); 6 } 7 8 public static void main(String args[]) { 9 temp(1, 2, 3); 10 } 11}