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,它有两个类型参数 TU,分别表示两个成员变量 firstsecond 的类型。在创建 Pair 的实例时,我们可以指定具体的类型,比如 Pair<String, Integer> 表示该实例的 firstString 类型的,secondInteger 类型的。

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