\quad
在 Java 5 泛型出來之前,集合中儲存的是通用型別 Object。Java 單繼承的結構意味著所有元素都基於 Object 類,所以在集合中可以儲存任何型別的資料,易於重用。要使用這樣的集合,我們先要往集合新增元素。由於 Java 5 版本前的集合只儲存 Object,當我們往集合中新增元素時,元素便向上轉型成了 Object,從而丟失自己原有的型別特性。這時我們再從集合中取出該元素時,元素的型別變成了 Object。那麼我們該怎麼將其轉回原先具體的型別呢?這裡,我們使用了強制型別轉換將其轉為更具體的型別,這個過程稱為物件的「向下轉型」。通過「向上轉型」,我們知道「圓形」也是一種「形狀」,這個過程是安全的。可是我們不能從「Object」看出其就是「圓形」或「形狀」,所以除非我們能確定元素的具體型別資訊,否則「向下轉型」就是不安全的。也不能說這樣的錯誤就是完全危險的,因為一旦我們轉化了錯誤的型別,程式就會執行出錯,丟擲「執行時異常」(RuntimeException)。(後面的章節會提到) 無論如何,我們要尋找一種在取出集合元素時確定其具體型別的方法。另外,每次取出元素都要做額外的「向下轉型」對程式和程式設計師都是一種開銷。以某種方式建立集合,以確認儲存元素的具體型別,減少集合元素「向下轉型」的開銷和可能出現的錯誤難道不好嗎?這種解決方案就是:引數化型別機制(Parameterized Type Mechanism)。
\quad
引數化型別機制可以使得編譯器能夠自動識別某個 class 的具體型別並正確地執行。舉個例子,對集合的引數化型別機制可以讓集合僅接受「形狀」這種型別的元素,並以「形狀」型別取出元素。Java 5 版本支援了引數化型別機制,稱之為「泛型」(Generic)。泛型是 Java 5 的主要特性之一。你可以按以下方式向 ArrayList 中新增 Shape(形狀):
ArrayList<Shape> shapes = new ArrayList<>();
注:以上例子,如果不加泛型的話,那就是預設返回Oject類