對象導論之容器(二)參數化類型

參數化類型
  在Java SE5出現之前,容器存儲的對象都是隻具有Java中的通用類型:Object。單根繼承結構意味着所有東西都是Object類型,所以可以存儲Object的容器可以存儲任何東西。這使得容器很容易被複用。
  要使用這樣的容器,只需在其中置入對象引用,稍後還可以將它們取回。但是由於容器只存儲Object,所以當將對象引用置入容時,它必須被向上轉型爲Object,因此它會丟失其身份。當把它取回時,就獲取了一個對Object對象的引用,而不是對置入時的那個類型的對象的引用。所以,怎樣才能將它變回先前置入容器中時的具有實用接口的對象呢?
  這裏再度用到了轉型,但這一次不是向繼承結i構的上層轉型爲一個更泛化的類型,而是向下轉型爲更具體的類型。這種轉型的方式稱爲向下轉型。我們知道,向上轉型是安全的,例如Circle是一種Shape類型;但是不知道某個Object是Circle還是Shape,所以除非確切知道所要處理的對象的類型,否則向下轉型幾乎是不安全的。
  然而向下轉型並非徹底是危險的,因爲如果向下轉型爲錯誤的類型,就會得到被稱爲異常的運行時錯誤,稍後會介紹什麼是異常。儘管如此,當從容器中取出對象引用時,還是必須要以某種方式記住這些對象究竟是什麼類型,這樣才能執行正確的向下轉型。
  向下轉型和運行時的檢查需要額外的程序運行時間,也需要程序員付出更多的心血。那麼創建這樣的容器,它知道自己所保護的對象的類型,從而不需要向下轉型以及消除犯錯誤的可能,這樣不是更有意義嗎?這種解決方案被稱爲參數化類型機制。參數化類型就是一個編譯器可以自動定製作用於特定類型上的類。例如,通過使用參數化類型,編譯器可以定製一個只接納和取出Shape對象的容器。
  Java SE5的重大變化之一就是增加了參數化類型,在Java中它稱爲範型。一對尖括號,中間包含類型信息,通過這些特徵就可以識別對範型的使用。例如,可以用下面這樣的語句來創建一個存儲Shape的ArrayList:

		ArrayList<Shape> shapes = new ArrayList<Shape>();

爲了利用範型的優點,很多標準類庫構建都已經進行了修改。就像我們將要看到的那樣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章