Java 泛型 - 类名

1. 引言

在 Java 中,泛型是一种强大的特性,它可以让我们在编写代码时提供更好的类型安全性和代码重用性。本文将深入探讨 Java 泛型中的类名部分。

2. 什么是泛型?

泛型是一种将类型参数化的方式,它允许我们定义类、接口和方法,在定义的时候使用一个或多个类型参数。这样一来,我们可以在使用泛型的地方使用不同的类型,从而实现代码的通用性。

3. 泛型类的定义

在 Java 中,我们可以定义一个泛型类。泛型类的定义使用了类型参数,它放在类名的后面,使用尖括号(<>)括起来。下面是一个简单的泛型类的例子:

public class Box<T> {
    private T item;
    
    public void setItem(T item) {
        this.item = item;
    }
    
    public T getItem() {
        return item;
    }
}

在上面的代码中,我们定义了一个名为 Box 的泛型类。它有一个类型参数 T,代表了这个类可以接受的类型。类中的成员变量 item 和方法 setItemgetItem 都使用了类型参数 T

4. 使用泛型类

使用泛型类非常简单,我们只需要在创建对象的时候提供一个具体的类型参数即可。下面是一个使用 Box 泛型类的示例:

Box<Integer> integerBox = new Box<>();
integerBox.setItem(10);
int value = integerBox.getItem();
System.out.println(value); // 输出 10

在上面的代码中,我们创建了一个 Box 对象,指定了类型参数为 Integer。然后我们设置了 item 的值为 10,并通过 getItem 方法获取该值并打印出来。

5. 多个类型参数

除了可以使用一个类型参数,我们还可以同时使用多个类型参数。下面是一个使用了两个类型参数的泛型类的示例:

public 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 的泛型类,它有两个类型参数 TU。类中有两个成员变量 firstsecond,分别表示了两个对象的值。

使用这个泛型类的示例代码如下所示:

Pair<String, Integer> pair = new Pair<>("hello", 42);
String first = pair.getFirst();
Integer second = pair.getSecond();
System.out.println(first); // 输出 "hello"
System.out.println(second); // 输出 42

在上面的代码中,我们创建了一个 Pair 对象,指定了类型参数为 StringInteger。然后我们获取了 firstsecond 的值并打印出来。

6. 通配符

在使用泛型类的时候,有时候我们希望可以接受任意类型的参数,而不仅仅是具体的类型。这时可以使用通配符 ?。下面是一个使用了通配符的示例:

public static void printBox(Box<?> box) {
    System.out.println(box.getItem());
}

在上面的代码中,我们定义了一个静态方法 printBox,它的参数是一个 Box 对象,但是我们不关心具体的类型是什么。在方法体中,我们只是简单地打印了 box 中的值。

下面是调用这个方法的示例代码:

Box<Integer> integerBox = new Box<>();
integerBox.setItem(10);
printBox(integerBox); // 输出 10

Box<String> stringBox = new Box<>();
stringBox.setItem("hello");
printBox(stringBox); // 输出 "hello"

在上面的代码中,我们调用了 printBox 方法两次,分别传入了一个 Box<Integer> 和一个 Box<String> 对象。由于 printBox