泛型教程(四)---有界类型参数


有界类型参数(Bounded Type Parameters)

你是否曾经。。。
你是否曾经想在一个参数化类型(parameterized type)里限制type argument的类型?比如一个只处理数字的方法只想接受Number或者其子类的实例。那么就靠有界类型参数可以实现啦。

声明有界类型参数,列出类型参数的名字,之后跟 extends 关键子,之后跟上界,本例中也就是Number。在本文中,extends表示的就是扩展(extends)一个class或者interface。

public class Box {

private T t;

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

public T get() {
return t;
}

public 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 integerBox = new Box();
integerBox.set(new Integer(10));
integerBox.inspect("some text"); // error: this is still String!
}
}

这里编译就会错误,泛化方法里限制了上界为number,而我们调用该方法是还是用String。

另外,允许你调用上界的方法,比如可以调用Number的方法。下例显示可以调用Integer的方法

public class NaturalNumber {

private T n;

public NaturalNumber(T n) { this.n = n; }

public boolean isEven() {
return n. intValue() % 2 == 0;
}

// ...
}

在isEven方法里,我们调用了Integer的方法 intValue()

多个上界
上面之介绍了单个上界,实际中,类型参数可以有多个上界。


一个有多个上界的类型变量是这几个上界的子类型。如果其中一个上界是类,则必须先写,比如

Class A
interface B
interface C
class D

如果不先写A,在编译的时候会报错。

泛化方法和上界类型参数
上界类型参数是实现泛化算法的关键。看下面的方法:计算数组T[ ]里面比某一元素elem大的元素的数量

public static int countGreaterThen(T[] anArray, T elem){
int count = 0;
for(T e: anArray){
if(e > elem) // compiler error
++count;
}
return count;
}

这里的方法实现非常明了,但是编译不通过。因为大于操作 > 只针对原始类型,比如short,int,long.double等等。你无法用> 去比较两个对象。去解决这个问题,让类型参数的上界为一个Comparable接口

public interface Comparable{
public int compareTo(T o);
}
最好代码改为:

public static > int countGreaterThen(T[] anArray, T elem){
int count = 0;
for(T e: anArray){
if(e > elem)
++count;
}
return count;
}





















你可能感兴趣的:(java)