📜  Java中的泛型构造函数和接口(1)

📅  最后修改于: 2023-12-03 14:42:58.331000             🧑  作者: Mango

Java中的泛型构造函数和接口

在Java中,泛型不仅可以用在类和方法中,还可以用在构造函数和接口中。下面我们来分别介绍一下泛型构造函数和泛型接口。

泛型构造函数

与普通构造函数不同的是,泛型构造函数中可以定义泛型参数。下面是一个例子:

public class Pair<T> {
    private T first;
    private T second;
    
    public <U extends T> Pair(U first, T second) {
        this.first = first;
        this.second = second;
    }
    
    //...其他方法
}

在上面的例子中,我们定义了一个泛型类Pair,同时定义了一个泛型构造函数。这个构造函数有一个泛型参数U,它必须是T的子类。在构造函数的实现中,我们用U来接收第一个参数,这样就可以保证firstT类型的。

泛型接口

泛型接口与泛型类很类似。以下是一个泛型接口的例子:

public interface List<T> {
    int size();
    boolean isEmpty();
    void add(T val);
    //...
}

在这个例子中,我们定义了一个泛型接口List,它的泛型参数为T。接口中的方法都使用了T这个泛型参数。这样,我们在实现这个接口时,就可以指定T的实际类型。

泛型构造函数和泛型接口的组合

当我们需要在一个类中使用泛型构造函数和泛型接口时,需要格外注意类型的定义。下面是一个例子:

public class ArrayStack<T> implements List<T> {
    private T[] array;
    //...
    
    public <U extends T> ArrayStack(U... vals) {
        this.array = (T[]) vals;
    }
    
    @Override
    public void add(T val) {
        //...
    }
    
    //...
}

在这个例子中,我们定义了一个ArrayStack类,它实现了List接口,并且有一个泛型构造函数。在构造函数中,我们将U泛型参数的数组转换为T类型的数组,并将其赋值给array成员变量。在add方法中,我们直接使用了T泛型参数,因为T已经在List接口中被定义了。

以上就是Java中泛型构造函数和泛型接口的介绍。使用泛型可以让我们更加灵活地定义类和接口,避免了一些类型转换的麻烦。