📅  最后修改于: 2023-12-03 14:42:58.331000             🧑  作者: Mango
在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
来接收第一个参数,这样就可以保证first
是T
类型的。
泛型接口与泛型类很类似。以下是一个泛型接口的例子:
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中泛型构造函数和泛型接口的介绍。使用泛型可以让我们更加灵活地定义类和接口,避免了一些类型转换的麻烦。