第一部分 泛型出現的原因
在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;
}
}