一、概述
Java泛型方法是指定义在类中的带有泛型参数的方法,它可以在方法定义时声明一个或多个类型参数,让调用者在使用该方法时自由指定参数类型。
与泛型类相比,泛型方法更加灵活,可以定义在普通类、泛型类和接口中。泛型方法具有以下特点:
- 可以在方法中使用泛型参数
- 可以在方法中定义额外的泛型参数
- 可以使用类上的泛型参数
- 可以在方法中指定泛型参数的上限和下限
二、使用方法
泛型方法的声明语法如下所示:
<T> 返回类型 方法名(参数列表) { // 方法体 }
其中,<T> 表示泛型参数,可以是任何标识符。在方法定义中,可以使用该标识符来代表某种类型。例如:
public <T> T getValue(T[] array, int index) { return array[index]; }
这个方法接收一个泛型数组和一个整数索引,并返回指定索引处的值。由于这是一个泛型方法,因此在方法定义中需要使用 <T> 来声明泛型参数。
调用泛型方法时,在方法名之前添加尖括号,并在其中指定类型参数。例如:
String[] names = {"Alice", "Bob", "Charlie"}; String result = getValue(names, 1); System.out.println(result); // 输出 "Bob"
这里我们调用了 getValue() 方法,并将其类型参数指定为 String。该方法将返回名字数组中索引为 1 的元素,也就是 "Bob"。
三、使用上限和下限
泛型方法中还可以使用通配符来限制类型参数的范围。其中, 表示 T 的子类, 表示 T 的超类。例如:
public <T extends Number> double sum(T[] numbers) { double total = 0; for (T number : numbers) { total += number.doubleValue(); } return total; }
该方法接收任何继承自 Number 类的数组,并将它们的值相加。在方法定义中,我们使用了 extends 关键字来限制泛型参数的类型,保证其只能是 Number 或其子类。调用 sum() 方法时,可以传递任何继承自 Number 的类型数组,例如:
Integer[] ints = {1, 2, 3}; double result = sum(ints); System.out.println(result); // 输出 "6.0" Double[] doubles = {1.5, 2.5, 3.5}; result = sum(doubles); System.out.println(result); // 输出 "7.5"
这里我们分别传递了 Integer 和 Double 数组,并成功计算出它们的和。
四、使用泛型方法实现类型转换
泛型方法还可以用于实现类型转换,例如:
public static <T> List<T> toList(T[] array) { List<T> list = new ArrayList<>(); for (T element : array) { list.add(element); } return list; }
该方法接收一个数组,并将其转换为列表。在方法定义中,我们使用了泛型参数 T,以便可以将任何类型的数组转换为相应的列表。调用 toList() 方法时,可以传递任何类型的数组,并得到相应类型的列表:
String[] strings = {"foo", "bar", "baz"}; List<String> list = toList(strings); System.out.println(list); // 输出 "[foo, bar, baz]"
五、使用泛型方法实现类型推断
在 Java 7 中,引入了 "菱形语法",可以用来自动推断泛型的类型参数。例如:
List<String> names = new ArrayList<>(); names.add("Alice"); names.add("Bob"); names.add("Charlie"); String first = names.get(0); System.out.println(first); // 输出 "Alice"
在这个例子中,我们创建了一个名字列表,并添加了一些名字。然后,我们调用 get() 方法来获取列表中的第一个元素。在 Java 6 中,需要将代码写成:
List<String> names = new ArrayList<String>();
其中,泛型类型参数必须在两个尖括号中都指定。但在 Java 7 中,可以使用菱形语法,由编译器自动推断泛型类型参数,因此可以更简洁地编写代码。
六、总结
Java泛型方法是一种非常灵活的语言特性,它可以让我们在方法中使用泛型参数,增强代码的重用性和安全性。在实际开发中,我们可以通过使用泛型方法来实现类型转换、类型推断等功能,使代码更加简洁易懂。