Java 两个泛型参数

在Java中,泛型是一种强大的特性,它允许我们定义可以在不同类型之间共享的代码。泛型参数可以是任何类型,包括类、接口和原始类型。在本文中,我们将讨论如何在Java中使用两个泛型参数,并提供相应的代码示例。

什么是泛型参数

泛型参数是在声明类、接口或方法时使用的类型参数。它允许我们在使用这些类、接口或方法时指定实际的类型。通过使用泛型参数,我们可以编写具有更好类型安全性和重用性的代码。

使用两个泛型参数的例子

假设我们要编写一个名为Pair的类,它表示两个值的有序对。我们可以使用两个泛型参数来表示这两个值的类型。

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;
    }

    public void setFirst(T first) {
        this.first = first;
    }

    public void setSecond(U second) {
        this.second = second;
    }
}

在上面的代码中,我们定义了一个名为Pair的类,并使用<T, U>作为两个泛型参数。类中有两个私有变量firstsecond,它们的类型分别为TU。我们还提供了一些getter和setter方法来访问和修改这两个变量。

现在,我们可以创建Pair的实例,并指定实际的类型。

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

在上面的代码中,我们创建了一个Pair实例,其中第一个值的类型为String,第二个值的类型为Integer。然后,我们使用getFirstgetSecond方法获取这两个值,并打印它们。

泛型参数的限制

在Java中,我们可以使用泛型参数的上限来限制它们的类型。上限是指泛型参数可以是指定类型或指定类型的子类。例如,如果我们只想让两个泛型参数都是Number类或其子类,我们可以像下面这样限制它们的类型。

class Pair<T extends Number, U extends Number> {
    // ...
}

在上面的代码中,我们使用extends Number来限制两个泛型参数的类型。

序列图

下面是一个使用Pair类的序列图示例。

sequenceDiagram
    participant Client
    participant Pair

    Client->>+Pair: 创建实例
    Client->>Pair: 调用setFirst和setSecond方法
    Client->>Pair: 调用getFirst和getSecond方法
    Pair->>-Client: 返回结果

上面的序列图展示了一个典型的客户端与Pair类之间的交互过程。客户端首先创建Pair的实例,然后通过调用方法设置和获取值。最后,Pair返回结果给客户端。

关系图

下面是一个使用Pair类的关系图示例。

erDiagram
    Pair ||-- T: has
    Pair ||-- U: has

上面的关系图展示了Pair类与其泛型参数TU之间的关系。Pair类拥有类型为TU的对象。

结论

通过使用两个泛型参数,我们可以编写更灵活和通用的代码。Java中的泛型参数允许我们在使用类、接口或方法时指定实际的类型,从而提高代码的类型安全性和重用性。希望本文能帮助你理解和使用Java中的两个泛型参数。