Java 泛型
Java 泛型是 Java 语言中的一个重要特性,它允许我们在编写代码时使用参数化类型。通过使用泛型,我们可以在编译时检查类型安全性,并提高代码的可读性和可维护性。本文将详细介绍 Java 泛型的概念、使用方法和常见应用场景。
1. 泛型的概念
Java 泛型是一种参数化类型的机制,它使得我们可以在类、接口、方法中使用类型参数。通过使用泛型,我们可以将类型参数化,使得代码更加通用和灵活。泛型的基本概念可以用以下代码示例来说明:
// 定义一个泛型类
class Box<T> {
private T item;
public void setItem(T item) {
this.item = item;
}
public T getItem() {
return item;
}
}
// 使用泛型类
Box<Integer> box = new Box<>();
box.setItem(10);
int value = box.getItem();
在上面的示例中,我们定义了一个泛型类 Box
,它可以存储任意类型的对象。通过 <T>
来声明类型参数,T
可以是任意标识符,代表一个占位符类型。在使用时,我们可以指定具体的类型,比如 Box<Integer>
表示这个 Box
实例只能存储 Integer
类型的对象。
2. 泛型类
泛型类是最常见的泛型使用方式,它允许我们在类的声明中使用类型参数。通过使用泛型类,我们可以创建一种通用类型的容器,可以存储任意类型的对象。下面是一个使用泛型类的示例:
class Pair<T, U> {
private T first;
private U second;
public Pair(T first, U second) {
this.first = first;
this.second = second;
}
public T getFirst() {
return first;
}
public U getSecond() {
return second;
}
}
// 使用泛型类
Pair<String, Integer> pair = new Pair<>("Java", 10);
String first = pair.getFirst();
int second = pair.getSecond();
在上面的示例中,我们定义了一个泛型类 Pair
,它有两个类型参数 T
和 U
,分别表示两个成员变量 first
和 second
的类型。在创建 Pair
的实例时,我们可以指定具体的类型,比如 Pair<String, Integer>
表示该实例的 first
是 String
类型的,second
是 Integer
类型的。
3. 泛型方法
除了在类中使用泛型,我们还可以在方法中使用泛型。泛型方法可以使方法更加灵活,可以根据传入参数的类型进行不同的操作。下面是一个使用泛型方法的示例:
class ArrayUtils {
public static <T> void printArray(T[] array) {
for (T item : array) {
System.out.println(item);
}
}
}
// 使用泛型方法
String[] strings = {"Java", "Python", "C++"};
ArrayUtils.printArray(strings);
Integer[] numbers = {1, 2, 3, 4, 5};
ArrayUtils.printArray(numbers);
在上面的示例中,我们定义了一个泛型方法 printArray
,它接受一个泛型数组作为参数,并打印数组中的元素。通过使用 <T>
来声明类型参数,我们可以在方法中使用 T
类型的变量。
4. 通配符
通配符是泛型中的一种特殊语法,它可以用于处理不同类型的泛型参数。通配符使用 ?
表示,表示未知类型。下面是一个使用通配符的示例:
class MathUtils {
public static double sum(List<? extends Number> numbers) {
double sum = 0;
for (Number number : numbers) {
sum += number.doubleValue();
}
return sum;
}
}
// 使用通配符
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
double sum1 = MathUtils.sum(integers);
List<Double> doubles = Arrays.asList(1.0, 2.0, 3.0, 4