夏眠鱼

Oct 21, 2017

Java 泛型-泛型边界

在泛型使用过程中,有时候我们希望可以限制类型参数(Type Argument)的类型,这时就会用到泛型边界。使用泛型边界很简单,在定义泛型类型或泛型方法时,使用 extends 关键字即可。

泛型类型边界

声明一个有界的泛型类型,语法类似类的继承,在类型参数后面添加 extends 关键字,extends 后面添加边界。需要注意的是,这里的 extends 有「类的继承」或「接口的实现」之意。

我们看下面一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Box<T> {

private T t;

public void set(T t) {
this.t = t;
}

public T get() {
return t;
}

public <U extends Number> void inspect(U u){
System.out.println("T: " + t.getClass().getName());
System.out.println("U: " + u.getClass().getName());
}

public static void main(String[] args) {
Box<Integer> integerBox = new Box<Integer>();
integerBox.set(new Integer(10));
integerBox.inspect("some text"); // compile error
}
}

泛型方法边界

有界类型参数是实现通用算法的关键。下面的方法是计算 T[] 数组中大于指定元素 elem 的元素个数。

1
2
3
4
5
6
7
8
9
public static <T> int countGreaterThan(T[] anArray, T elem) {
int count = 0;
for (T e : anArray) {
if (e > elem) { // compiler error
++count;
}
}
return count;
}

上面的方法实现很简单,但是编译不通过,因为 > 运算符只接收基本类型,比如 short、int、double、long、float、byte 和 char。我们不能使用 > 运算符来比较对象。为了解决这个问题,我们可以使用边界为 Comparable<T> 接口的类型参数:

1
2
3
public interface Comparable<T> {
public int compareTo(T o);
}

最终的代码如下:

1
2
3
4
5
6
7
8
9
public static <T extends Comparable<T>> int countGreaterThan(T[] anArray, T elem) {
int count = 0;
for (T e : anArray) {
if (e.compareTo(elem) > 0) {
++count;
}
}
return count;
}
OLDER > < NEWER