有界类型参数(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!
}
}
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;
}
// ...
}
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;
}