您的位置:

Java泛型方法

一、概述

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泛型方法是一种非常灵活的语言特性,它可以让我们在方法中使用泛型参数,增强代码的重用性和安全性。在实际开发中,我们可以通过使用泛型方法来实现类型转换、类型推断等功能,使代码更加简洁易懂。