简单的泛型
1.一个堆栈类
//实现内部链式存储机制
public class LinkedStack<T> {
private static class Node<U>{
U item;//
Node next;
public Node(){
this.item=null;
this.next=null;
}
public Node(U item,Node next){
this.item=item;
this.next=next;
}
public boolean end(){
return this.item==null&&this.next==null;
}
}
private Node<T> top=new Node<T>();//末端哨兵
public void put(T item){
top=new Node<T>(item,top);
}
public T pop(){
T result=top.item;
if(!top.end()){
top=top.next;
}
return result;
}
public static void main(String[] args) {
LinkedStack<String> ls=new LinkedStack<String>();
for(String s:"nihao zhongguo welcome!".split(" ")){
ls.put(s);
}
String ss;
while((ss=ls.pop())!=null){
System.out.println(ss);
}
}
}
内部类Node也是一个泛型,他拥有自己的类型参数。
这个例子试用了末端哨兵来判断堆栈何时为空,这个末端哨兵是在构造LinkedStack时创建的。然后每调用一次push方法,就会创建一个Node<t>对象,并将其链接到前一个Node<T>,当你调用pop方法,总是返回top.item然后丢弃当前top所指的Node<t>,并将top移到下一个node,除非你碰到末端哨兵,这时候就不会移动top了,如果已经到了末端,客户端还在继续调用pop方法,他只能得到null,说明堆栈已经空了。
练习:移除Node类上的类型参数,并修改LinkedStack.java的代码,证明内部类可以访问其外部类的类型参数。
附录:
/*带哨兵的直接顺序查找,n为数组元素个数,key为待查找元素*/
int sequential_search(int a[],int n,int key) {
int i=n;
a[0]=key; //a[0]是监视哨
while(a[i]!=key) //若数组中无key,则一定会得到a[0]=key
i--;
return i; //查找失败返回0
}
值得一提的是设置监视哨这一思想,将a[0]设置成监视哨则可以避免每次比较元素后都需要判断下标是否越界这一问题,从而节省了时间。当然,a[0]中将不能在存放有效元素。
泛型的主要目的之一就是用来指定容器要持有什么类型的对象,而且由编译器来保证类型的正确性。泛型类型也就是另一种类型罢了,只是用来限制类型,容易误导的一点,类字面常量 .class用法是:类.class,不可用于泛型。