Java 中不仅类可以声明泛型,类中的方法也可以声明仅用于自身的泛型,这种方法叫做泛型方法。泛型方法是一种在方法中使用泛型类型参数的特殊方法。通过在方法声明中使用尖括号 <T> 来定义泛型类型参数,然后可以在方法的参数、返回值或方法体中使用这个泛型类型参数。
其格式定义为:
访问修饰符 <泛型列表> 返回类型 方法名(参数列表){ // 实现代码 }
其中:
(1)访问修饰符:和普通方法的修饰符一样,允许 public、protected、private 等。
(2)<泛型列表>:用来指定泛型方法可用的泛型参数列表。
(3)返回类型:用来指定泛型方法的返回类型,可以是泛型参数。
(4)方法名:用来指定泛型方法的名称。
(5)参数列表,用来指定泛型方法的参数,可以是泛型参数。
上面介绍了泛型方法的语法,下面示例,将展示如何定义和使用泛型方法。
代码如下:
public class GenericMethodExample { // 泛型方法,接受一个泛型类型参数 T,并返回一个 T类型的数组 public static <T> T[] createArray(T item, int length) { T[] array = (T[]) new Object[length]; for (int i = 0; i < length; i++) { array[i] = item; } return array; } public static void main(String[] args) { // 调用泛型方法,传入String类型参数,返回一个 String 类型的数组 String[] stringArray = createArray("Hello", 5); System.out.println(Arrays.toString(stringArray)); // 输出:[Hello, Hello, Hello, Hello, Hello] // 调用泛型方法,传入Integer类型参数,返回一个Integer类型的数组 Integer[] intArray = createArray(10, 3); System.out.println(Arrays.toString(intArray)); // 输出:[10, 10, 10] } }
在上面的示例中,createArray 方法是一个泛型方法。它接受一个泛型类型参数 T,并返回一个 T 类型的数组。在方法体内部,我们使用了类型转换和循环来创建一个指定长度的数组,并将传入的参数赋值给数组的每个元素。
在 main 方法中,我们分别调用了 createArray 方法两次,一次传入了 String 类型的参数,一次传入了 Integer 类型的参数。根据传入的参数类型,泛型方法返回了相应类型的数组,并将其打印输出。
泛型方法和泛型类、泛型接口类似,也支持泛型通配符。
泛型方法通配符是一种用于限制泛型方法参数类型的特殊语法。通配符可以用来表示未知的类型,或者表示某个类型的子类型或父类型。
在泛型方法中,通配符有两种形式:上界通配符和下界通配符。
使用 “? extends 类型” 表示,上界通配符限制了泛型方法的参数类型必须是指定类型或其子类型。
public class GenericMethodExample { public static <T extends Number> void printList(List<T> list) { for (T item : list) { System.out.println(item); } } public static void main(String[] args) { List<Integer> integerList = Arrays.asList(1, 2, 3); printList(integerList); // 调用泛型方法,传入Integer类型的List List<Double> doubleList = Arrays.asList(1.0, 2.0, 3.0); printList(doubleList); // 调用泛型方法,传入Double类型的List } }
在上面的示例中,printList 是一个泛型方法,使用了上界通配符 “? extends Number” 来限制参数类型。这样,我们可以传入 List<Integer> 或 List<Double> 作为参数,因为它们都是 Number 类型的子类型。
使用 “? super 类型” 表示,下界通配符限制了泛型方法的参数类型必须是指定类型或其父类型。
public class GenericMethodExample { public static void addToList(List<? super Integer> list, int value) { list.add(value); } public static void main(String[] args) { List<Number> numberList = new ArrayList<>(); numberList.add(1.0); addToList(numberList, 2); // 调用泛型方法,传入Number类型的List和int类型的值 List<Object> objectList = new ArrayList<>(); objectList.add("hello"); addToList(objectList, 3); // 调用泛型方法,传入Object类型的List和int类型的值 } }
在上面的示例中,addToList 是一个泛型方法,使用了下界通配符 “? super Integer” 来限制参数类型。这样,我们可以传入 List<Number> 或 List<Object> 作为参数,因为它们都是 Integer 类型的父类型。