Java 基础教程

Java 泛型方法

泛型方法定义

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 类型的父类型。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号