Java泛型--目录
在Java SE5之前,我们想要让方式持有Object对象,来存储任何类型的对象,如下面的代码所示
public class Holder { private Object item; public Object getItem() { return item; } public void setItem(Object item) { this.item = item; } public static void main(String[] args) { Holder holder = new Holder(); //持有Integer类型 holder.setItem(new Integer(3)); Integer item1 = (Integer) holder.getItem(); //持有String类型 holder.setItem(new String("hello word")); String item2 = (String) holder.getItem(); } }
Holder可用持有任何类型的对象,在例子中先后持有了Integer,String类型的对象,但是这种方式必须通过强转,而且需要预先知道持有的时什么类型,或者使用instanceof判断,然后才能强转,否则运行时会报强转失败的异常.
我们对上面的例子运用泛型进行稍微的改动,要达到这个目的,需要使用类型参数,用尖括号括住,放在类名后面.在使用的时候,在使用实际的类型替换此参数.如下所示:
class Holder2<T>{ private T item; public T getItem() { return item; } public void setItem(T item) { this.item = item; } public static void main(String[] args) { //声明持有Integer类型的holder2 Holder2<Integer> holder2 = new Holder2<Integer>(); //持有Integer类型 holder2.setItem(new Integer(1)); Integer item1 = holder2.getItem(); //持有string类型. 编译报错 //holder2.setItem(new String("1234")); } }
在创建holder2的时候,必须指明想持有什么类型的参数,将其置于尖括号内,然后你只需要存入指定的类型,在取出时,自动的就是正确的类型了.
通过这个例子,表示了Java泛型的核心概念:告诉编译器你想使用什么类型,然后编译器就帮你处理一切细节.
这是一个稍微复杂一点的例子,我们使用泛型实现栈(Stack),来存放不同类型的数据,代码如下:
public class MyStack<T> { //栈顶指针 private Node<T> top; //堆栈大小 private int count = 0; //节点 class Node<T> { public Node(T item, Node<T> next){ this.item = item; this.next = next; } //数据对象 T item; //下一个节点 Node<T> next; } /** * 是否时空栈 * @return */ public boolean isEmpty(){ return count == 0; } /** * 入栈,压入栈顶 * * @param item */ public void push(T item) { Node<T> next = null; if (top != null) { next = top; } Node<T> itemNode = new Node<T>(item,next); top = itemNode; count ++; } /** * 出栈 * @return */ public T pop(){ if(isEmpty()){ return null; } T item = top.item; top = top.next; count --; return item; } public static void main(String[] args) { //真的Integer的堆栈 MyStack<Integer> myStack = new MyStack<Integer>(); System.out.println(myStack.pop()); myStack.push(2); myStack.push(3); System.out.println(myStack.pop()); System.out.println(myStack.pop()); System.out.println(myStack.pop()); } } /* 输出如下: null 3 2 null */