java編程之泛型(一)

第一部分 泛型出現的原因


   在java SE5之前,一般的類和方法只能使用具體的類型——基本類型或自定義類。但這不利於編寫應用於多種類型的代碼。
   雖然多態的出現在一定程度上解決了這種尷尬,但考慮到除了final類,其他任何類都能被擴展,這種靈活性會帶來一些性能的損耗。
   接口也許是一種解決這種問題的好方式,可是一旦指明瞭接口,就會要求代碼使用特定的接口。所以這也將爲編寫代碼帶來一定程度的限制。
   自 java SE5及之後的版本重大的變化之一就是添加了泛型的概念,泛型實現了*類型的參數化*,使得代碼可以應用於多種類型。

第二部分 簡單泛型


首先,看這樣一個例子:

class AutoClass {}

//Holder只能持有單個對象,因此它的複用性很差
class Holder {
    private AutoClass a;
    public Holder(AutoClass a) {this.a = a;}
    AutoClass getA(){return a;}
}

要提高代碼的重用性,可以不指定具體類型,利用泛型結構來定義類

//類型參數T用尖括號括住,放在類名後
class HolderGenerics<T>{
    private T t;
    public Generics(T t){this.t = t;}
    T getT(){return t;}
}  
public class Achieve{
    public static void main(String[] args){

//此處在使用時用具體類型AutoClass替換類型參數T
        HolderGenerics<AutoClass> hg = new HolderGenerics<AutoClass>(AutoClass a);
    }
}

1、元組類庫


    元組:將一組對象打包存儲於一個單一的容器對象,容器對象允許讀取其中元素,但不允許向其中存放新的對象。
    元組可以是任意長度,任意類型的。
//二維元組

public class TwoTuple<A,B>{
/*此處未將字段first和second聲明爲private,並不違反安全性原則
原因是final聲明不允許再爲first,second賦予其他的值*/
    public final A first;
    public final B second;
    public TwoTuple(A a,B b){
        first = a;
        second = b;
    } 
}
//多維元組
//可以利用繼承機制增加元組長度

public class ThreeTuple<A,B,C> extends TwoTuple<A,B>{
    public final C third;
    public ThreeTuple(A a,B b,C c){
        super(a,b);
        this.third = c;
    }
} 

2、堆棧類


傳統的堆棧可以用LinkedList實現

import java.util.LinkedList;

public class Stack<T> {
    private LinkedList<T> storage= new LinkedList<T>();

    //Stack方法調用LinkedList中的方法

    public void push(T v){storage.addFirst(v);}
    public T peek(){return storage.getFirst();}
    public T pop(){return storage.removeFirst();}
    public boolean empty(){return storage.isEmpty();}
    public String toString(){return storage.toString();}
}

不用LinkedList來實現內部鏈式存儲機制

public class OwnStack<T> {
    private static class Node<U> {
        U item;
        Node<U> next;

        Node() {
            item = null;
            next = null;
        }

        Node(U item, Node<U> next) {
            this.item = item;
            this.next = next;
        }

        boolean end() {
            return item == null && next == null;
        }
    }

    private Node<T> top = new Node<T>();
    //入棧方法
    public void push(T item) {
        top = new Node<T>(item, top);
    }
    //出棧方法
    public T pop() {
        T result = top.item;
        if (!top.end())
            top = top.next;
        return result;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章