如果我们设计一个类,比如说设计一个定容栈(FixedCapacityOfString),则它只能处理特定类型的数据。比如定容栈FixedCapacityOfString只能处理String类型的数据,若想让它处理double数据呢?我们就需要重新用类似的代码重新设计一个类,也就是将String都换成double,有点麻烦!Java中的泛型就可以不用这么麻烦的解决这个问题。
我们可以用下面的代码声明一个类:
public class FixedCapacityStack<Item>
Item是一个类型参数,用于表示用例将会使用的具体数据类型的象征性的占位符。可以将FixedCapacityStack理解为某种元素的栈。在实现此类时,我们并不知道Item的实际类型,但用例只要能在创建类时提供具体的数据类型,它就能用此类处理任意的数据类型。实际的类型必须是引用类型,但用例可以依靠自动装箱将原始数据类型转换成相应的封装类型。Java会使用类型参数Item来检查类型不匹配的错误—–尽管具体的数据类型还不知道,赋予Item类型变量的值也必须是Item类型的。在这里一个细节非常重要:我们希望用以下代码在FixedCapacityStack的构造函数的实现中创建一个泛型的数组:
a = new Item[cap];
创建泛型数组在Java中不被允许的。 我们需要使用类型转换:
a = (Item[]) new Object[cap];
这段代码才能达到我们想要的效果(但Java编译器会给出一条警告(类型安全:未经检查的从 Object[] 到 Item[] 的强制类型转换),不过可以忽略它)。
定容栈FixedCapacityStack的具体实现:
public class FixedCapacityStack<Item> {
private Item[] a;//stack entries
private int N;//size
public FixedCapacityStack(int cap){
a=(Item[]) new Object[cap];
}
public boolean isEmpaty(){
return N==0;
}
public int size(){
return N;
}
public void push(Item item){
a[N++]=item;
}
public Item pop(){
return a[--N];
}
}
摘自《Algorithms Fourth Edition》Robert Sedgewick, Kevin Wayne(著); 谢路云(译)