Java中的形参与返回值泛型
引言
在Java中,泛型是一种强大的特性,它允许我们在编写代码时指定一种或多种类型的参数或返回值。形参与返回值泛型可以提高代码的可重用性和类型安全性,并在编译时捕获一些类型错误。
本文将介绍Java中形参与返回值泛型的用法,以及如何在代码中正确地使用它们。
泛型的基本概念
泛型是Java从JDK 1.5版本开始引入的特性,它允许我们在定义类、接口、方法时使用一个或多个类型参数。泛型类型参数可以用任何标识符来表示,通常使用大写字母来命名,比如T
、E
等。
泛型的基本语法如下:
class ClassName<T> {
// 类型参数T可在类内部使用
}
interface InterfaceName<T> {
// 类型参数T可在接口内部使用
}
// 泛型方法
<T> returnType methodName(T arg) {
// 类型参数T可在方法内部使用
}
在定义类或接口时,我们可以在类名或接口名后面使用尖括号(<>
)来指定一个或多个类型参数。在方法定义时,我们可以在返回类型前的尖括号内定义一个或多个类型参数。
使用形参与返回值泛型
泛型类
泛型类允许我们在类的定义中使用一个或多个类型参数,并在类内部使用这些类型参数。
下面是一个使用泛型类的示例:
public class Box<T> {
private T item;
public void setItem(T item) {
this.item = item;
}
public T getItem() {
return item;
}
}
在上面的例子中,Box
类使用类型参数T
来表示盒子中的物品的类型。setItem
方法和getItem
方法可以接受和返回任意类型的参数。
我们可以使用具体的类型实参来创建Box
类的对象,并使用该对象来存储和获取不同类型的数据:
Box<Integer> integerBox = new Box<>();
integerBox.setItem(123);
int value = integerBox.getItem(); // value = 123
Box<String> stringBox = new Box<>();
stringBox.setItem("Hello");
String message = stringBox.getItem(); // message = "Hello"
在上面的例子中,Box
类的类型参数T
被实例化为Integer
和String
,分别用于存储整数和字符串。
泛型方法
泛型方法是定义在类或接口中的方法,它使用类型参数来表示参数或返回值的类型。
下面是一个使用泛型方法的示例:
public class ArrayUtils {
public static <T> T getFirst(T[] array) {
if (array != null && array.length > 0) {
return array[0];
}
return null;
}
}
上面的例子中,getFirst
方法使用类型参数T
来表示数组的元素类型,该方法返回数组的第一个元素。
我们可以调用getFirst
方法并传入不同类型的数组来获取它们的第一个元素:
Integer[] numbers = {1, 2, 3, 4, 5};
Integer firstNumber = ArrayUtils.getFirst(numbers); // firstNumber = 1
String[] names = {"Alice", "Bob", "Charlie"};
String firstName = ArrayUtils.getFirst(names); // firstName = "Alice"
在上面的例子中,getFirst
方法的类型参数T
被实例化为Integer
和String
,分别用于获取整数数组和字符串数组的第一个元素。
通配符泛型
在使用泛型时,有时候我们希望可以接受或返回任意类型的参数,而不仅限于某个特定的类型。这时可以使用通配符泛型。
通配符泛型使用?
来表示不确定的类型。下面是一个使用通配符泛型的例子:
public class Printer {
public static void printList(List<?> list) {
for (Object item : list) {
System.out.println(item);
}
}
}
上面的例子中,printList
方法