Java開發筆記(六十九)泛型類的定義及其運用

前面從泛型方法的用法介紹到了泛型的起源,既然單個方法容許擁有泛化的參數類型,那麼一個類也應當支持類級別的泛化類型,例如各類容器類型ArrayList、HashMap等等。一旦某個類的定義代碼在類名稱後面添加「<T>」這種泛型聲明,該類就變成了泛型類(也稱模板類)。何況泛型類不僅僅支持一種泛型參數,還支持同時聲明多種泛型參數,像「<T>」表示當前類存在惟一一種泛型參數;若想聲明當前類擁有兩種泛型參數,則可以使用「<T, R>」這種以逗號隔開的泛型列表;同時聲明三種泛型參數的話,尖括號內的泛型列表就有三個參數,形如「<U, V, W>」這般;至於更多種泛型參數的聲明方式可依此類推。
在泛型類的內部代碼中,事先已經聲明的泛型能夠拿來直接使用,無需在成員方法前面額外添加「<T>」。除此以外,在類代碼中使用泛型T就跟使用普通類型同樣,能夠用它來建立泛型實例,能夠用它表示輸入參數的類型,也能夠用它表示輸出參數的類型。舉個泛型類的簡單應用例子,如今準備利用清單List來保存數據,而後想獲取這組數據當中最長的元素,以及最短的元素。按照前述需求,劃分該泛型類應當具有的功能,初步羅列包括如下幾點:
一、泛型類要聲明一個泛型參數「<T>」,用於給清單須要的元素類型佔位;
二、定義泛型類的構造方法,傳入待保存的清單對象,其中對象類型爲「List<T>」;
三、定義getMaxLengthItem方法,用於獲取長度最大的清單元素,注意該方法的輸出參數類型爲T;
四、定義getMinLengthItem方法,用於獲取長度最小的清單元素,該方法的輸出參數類型也爲T;
根據上面的幾點功能要求,編碼實現的泛型類代碼示例以下:html

//定義簡單的泛型清單。
//類名後面添加「<T>」,表示該類的內部代碼中,全部的T類型都爲外部須要時再指定的泛型。
//若是泛型不止一個,則用逗號隔開,好比兩個泛型可用「<T, R>」。
public class SimpleList<T> {
	private List<T> list; // 清單。注意清單元素的數據類型爲泛型T

	// 構造方法,傳入要保存的清單數據
	public SimpleList(List<T> list) {
		this.list = list;
	}
	
	// 獲取當前保存的清單數據
	public List<T> getData() {
		return this.list;
	}

	// 獲取長度最大的清單元素。注意這裏的返回數據爲泛型T
	public T getMaxLengthItem() {
		if (list == null || list.size() <= 0) {
			return null;
		}
		T t = list.get(0); // 利用T聲明瞭一個泛型變量t
		for (int i = 0; i < list.size(); i++) {
			if (list.get(i).toString().length() > t.toString().length()) {
				t = list.get(i);
			}
		}
		return t;
	}

	// 獲取長度最短的清單元素。注意這裏的返回數據爲泛型T
	public T getMinLengthItem() {
		if (list == null || list.size() <= 0) {
			return null;
		}
		T t = list.get(0); // 利用T聲明瞭一個泛型變量t
		for (int i = 0; i < list.size(); i++) {
			if (list.get(i).toString().length() < t.toString().length()) {
				t = list.get(i);
			}
		}
		return t;
	}
}

從這個泛型類的代碼可知,泛型T猶如系統自帶的數據類型通常,它在泛型類內部的使用毫無障礙,你能夠把它想象爲Integer類型,或者Double類型。縱觀整個泛型類的代碼,惟有最開始的類名後面多了個「<T>」,其它地方跟普通類就沒什麼兩樣了。java

外部調用泛型類的時候,可參照ArrayList、HashMap等容器類的用法,一樣在類名後面添加形如「<具體的數據類型名稱>」的模板。下面是段SimpleList的測試代碼,先構造指定清單的泛型實例,再分別調用getMaxLengthItem與getMinLengthItem方法獲取最長的元素和最短的元素,完整代碼以下所示:數組

		// 數組工具Arrays的asList方法能夠把一系列元素直接賦值給清單對象
		List<Double> doubleList = Arrays.asList(1.1, 2D, 3.1415926, 11.11);
		// 泛型實例的參數類型跟在類名稱後面,以尖括號包裹
		SimpleList<Double> simpleList = new SimpleList<Double>(doubleList);
		// 打印清單中最長的元素
		System.out.println("simpleList.getMaxLengthItem()=" + simpleList.getMaxLengthItem());
		// 打印清單中最短的元素
		System.out.println("simpleList.getMinLengthItem()=" + simpleList.getMinLengthItem());

 

運行以上的測試代碼,觀察到下面的日誌結果,可見泛型類SimpleList正確挑選出了最長的元素和最短的元素:工具

simpleList.getMaxLengthItem()=3.1415926
simpleList.getMinLengthItem()=1.1

  

更多Java技術文章參見《Java開發筆記(序)章節目錄測試

相關文章
相關標籤/搜索