在沒使用到泛型之前,有兩個類別擁有相同的功能:
public class IntegerObj { private Integer integerObj; /** * @param {Integer} integerObj */ public void set(Integer integerObj) { this.integerObj = integerObj; } /** * @type Integer */ public Integer get() { return integerObj; } }
public class StringObj { private Integer stringObj; /** * @param {String} stringObj */ public void set(String stringObj) { this.stringObj = stringObj; } /** * @type String */ public String get() { return stringObj; } }
以上這兩個class只有member型態上有差異,邏輯上是一模一樣,等於必須對兩種不同型態去各自撰寫一個類別,但同樣的,這些物件的最上層都是繼承Object,可將member成員替換成Object,最後再經由轉型就可以了。但是由於轉型也有轉錯的可能,那麼是不是能在宣告變數時,就先將型態定義好,並且使用同一個class,那麼這時就要使用到泛型了。
以下是個簡單的例子(java):
class CollectionExample<T>{ private T[] _objects; private int _index; /** * */ CollectionExample(int total){ _objects =(T[]) new Object[total]; _index = 0; } /** * @param {T} obj */ public boolean add(T obj){ boolean result = false; if(_index < _objects.length){ _objects[_index] = obj; _index++; result = true; } return result; } /** * @param {int} index * @type T */ public T get(int index){ return _objects[index]; } /** * @type int */ public int getLength(){ return _objects.length; } /** * */ public static void main(String[] args){ CollectionExample<Integer> collection = new CollectionExample<Integer>(10); // for(int i=1;i<=collection.getLength();i++) collection.add(i); for(int i=0;i<collection.getLength();i++) System.out.println(collection.get(i)); } }
<T>主要是來定義泛型用,T為變數名稱,換句話說他可以是其它文字,最主要用處是拿來替換型態用,例如當你宣告:
// CollectionExample<Integer> collection = new CollectionExample<Integer>(5);
上面class的變數T,將會取代成Integer。CollectionExample類別提供了add、get和getLength三個method,主要功能是將object儲存起來以及取出。
template <class CType> class CollectionExample{ // public: CollectionExample(int); ~CollectionExample(); void add(CType); int getLength(); CType get(int); private: CType *_objs; int _index; int _length; }; /** * @param {int} total */ template <class CType> CollectionExample<CType>::CollectionExample(int total){ _objs = new CType[total]; _length = total; _index = 0; } /** * */ template <class CType> CollectionExample<CType>::~CollectionExample() { delete [] _objs; } /** * @param {CType} obj */ template <class CType> void CollectionExample<CType>::add(CType obj){ if(_index<_length){ _objs[_index] = obj; _index++; } } /*** * @param {int} index * @type CType */ template <class CType> CType CollectionExample<CType>::get(int index){ if(index<_length) return _objs[index]; } /** * @type int */ template <class CType> int CollectionExample<CType>::getLength(){ return _length; }
main.cpp
#include <iostream> #include "CollectionExample.h" using namespace std; int main(){ CollectionExample<int> collection(10); for(int i=0;i<collection.getLength();i++) collection.add(i); for(int i=0;i<collection.getLength();i++) cout<<collection.get(i)<<endl; return 0; }
結果與java相同。