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

来源:互联网 发布:日本网络用语 笑 编辑:程序博客网 时间:2024/05/17 15:59

有界类型参数(Bounded Type Parameters)

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

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

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"); // error: this is still String!
}
}

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

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

public class NaturalNumber<T extends Integer> {

private T n;

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

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

// ...
}

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

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

<T extends B1 & B2 & B3>

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

Class A
interface B
interface C
class D <T extends A & B & C>

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

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

public static <T> 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<T>接口

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

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





















0 0
原创粉丝点击