在 Java 中创建泛型方法

2025年6月19日 | 阅读 6 分钟

Java 是一种非常流行的面向对象编程语言,用于创建各种应用程序。Java 编写泛型方法的能力是其最强大的功能之一。任何可用于多种对象类型的技术都称为泛型。通过这种实用的技术,开发人员可以设计可重用代码。

在本教程中,我们将通过示例程序详细介绍如何在 Java 中编写泛型方法。我们还将涵盖一些关于泛型方法的重要概念。

在 Java 中创建泛型方法

在 Java 中编写泛型方法时,需要使用尖括号语法来声明类型参数。类型参数是运行时提供给方法的实际类型的占位符。

声明泛型方法的语法

上面语法中的<T>表示正在声明一个名为 T 的类型参数。void 关键字表示该方法不返回值。方法参数接受通用类型 T,通过 methodName() 方法名指定。

例如,考虑以下输出对象数组的通用过程:

GenericMethod1.java

输出

Integer Array: 1 2 3 4 5 
String Array: Hello World !

上面的示例中声明了一个名为 printArray 的泛型方法,它接受类型为 T 的数组。该方法通过 for-each 循环遍历数组,然后将每个元素打印到终端。

让我们看看如何使用不同类型的数组调用此泛型方法:

GenericMethod2.java

输出

Integer array:
1 2 3 4 5 
Double array:
1.1 2.2 3.3 4.4 5.5 
String array:
hello world java generic method 

如您所见,printArray() 方法可以使用相同的实现来处理不同类型的数组。

带有多个类型参数的泛型方法

在某些情况下,我们可能需要在泛型方法中声明多个类型参数。我们可以通过在尖括号中使用逗号分隔的类型参数列表来做到这一点。

这是一个接受两个类型参数并返回布尔值的泛型方法的示例:

在上面的示例中,我们声明了两个类型参数 T 和 U。该方法接受类型为 T 和 U 的两个参数,并使用 equals() 方法检查它们是否相等。该方法返回一个布尔值,指示参数是否相等。

让我们看看如何使用不同类型的参数调用此泛型方法:

GenericMethod3.java

输出

true
false
true

在上面的示例中,我们使用三组不同的参数调用了 isEqual 方法——两个整数、两个字符串和两个双精度数。该方法可以使用相同的实现来处理所有这些类型的参数。

通配符类型参数

将对象传递给泛型方法时,有时我们可能不确定其确切类型。当这种情况发生时,我们可以使用带有通配符的类型参数来接受任何类型的对象。

例如,考虑以下通用过程,它接受任何类型的对象的数组并返回数组的第一个元素:

在上面的示例中,我们声明了一个名为 getFirstElement 的泛型方法,该方法接受任何类型的 T 对象的数组。该方法返回数组的第一个元素,其类型为 T。

让我们看看如何使用不同类型的数组调用此方法:

GenericMethod4.java

输出

First element of Integer array: 1
First element of Double array: 1.1
First element of String array: hello

在上面的示例中,我们使用三种不同类型的数组调用了 getFirstElement 方法——Integer、Double 和 String。该方法可以使用相同的实现来处理所有这些类型的数组。

类型擦除

在使用 Java 中的泛型方法时,有一个重要概念需要牢记,那就是类型擦除。类型擦除是在编译时删除泛型类型信息并用实际类型替换它的过程。

例如,考虑以下泛型方法:

在上面的示例中,我们声明了一个名为 printType 的泛型方法,该方法接受类型为 T 的参数。该方法使用 getClass() 方法将参数的类打印到控制台。

现在,让我们看看如何使用不同类型的参数调用此方法:

GenericMethod5.java

输出

Integer
String
Double

在上面的示例中,我们使用了三种不同类型的参数调用了 printType 方法——一个整数、一个字符串和一个双精度数。

这是因为参数的实际类型在编译时确定,并且泛型类型信息被擦除了。

类型擦除的一个后果是,我们无法使用某些依赖于泛型类型参数实际类型的操作。例如,我们无法创建类型为 T 的新对象,也无法调用未在 Object 类中定义的那些方法。

这是一个说明此点的示例:

在上面的示例中,我们尝试创建类型为 T 的新对象,并对类型为 T 的参数调用 someMethod() 方法。但是,这两种操作都会导致编译时错误,因为类型擦除导致在编译时不知道 T 的实际类型。我们也可以使用有界类型参数。有界类型参数允许我们为类型参数指定上界或下界,从而限制可与该方法一起使用的对象的类型。

例如,我们可以定义一个仅适用于实现 Comparable 接口的对象的泛型方法,该接口提供了比较相同类型对象的机制。这是一个例子:

GenericMethod6.java

输出

true
false
true

为了确保类型参数 T 实现 Comparable 接口,我们在上面的示例中使用了有界类型参数>。有界类型参数允许我们创建类型更安全、对可与它们一起使用的对象类型提供更大保证的泛型方法。

总而言之,Java 的泛型方法为程序员提供了一种强大的技术来设计可以处理各种对象类型的代码,而无需创建冗余代码。通过使用类型参数,我们可以为所有对象类型创建一个单一的方法实现。在这篇文章中,我们学习了如何在 Java 中声明泛型方法,如何使用通配符类型参数来接受任何类型的对象,以及类型擦除如何影响泛型方法的行为。此外,还举例说明了泛型方法的用法。总而言之,泛型方法是 Java 程序员工具箱中的一个宝贵工具,并且了解如何正确使用它们对于开发清晰可维护的代码至关重要。