java泛型--简单泛型


Java泛型--目录


Object持有对

在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
*/


你可能感兴趣的:(java,泛型,接口)