首頁 > 軟體

Java泛型介紹

2021-05-30 20:30:17

今天我們一起來了解一下java中一個很有用的概念:泛型。

先來說java泛型的定義。關於java泛型比較廣泛的說法是「參數化類型」。是不是有點懵?看不懂就對了,就是要你難理解才高大上啊!其實很簡單,就是將類型作為參數傳入到方法。java泛型通常以「<>」來包裹。

jdk中有許多使用泛型的例子。比如java集合框架。我們創建一個集合物件時可以這樣創建:

List list = new ArrayList<>();

由於沒有指明集合中元素的具體類型,我們在向集合中存入元素時,可以存入各種類型。這樣當我們把集合物件傳輸給另一個方法後,從集合中取出元素的類型是不知道的。在使用時可能發生類型轉換異常。

所以我麼需要再傳入類型作為參數,告訴jvm,元素的類型是什麼。安全的做法是如下圖的程式:

這樣我們就知道集合中的元素的類型了,但是這樣也限定了該集合只能夠存入字元串類型的元素。與List類似,Set集合、Map集合也都可以使用泛型規定元素的類型。

看到List集合的泛型使用,我們也可以仿照一個泛型類出來。

List集合源碼

如圖是我自己仿照List創建的一個泛型類:

我使用了「T」,「E」,「V」替換實際的類型來創建類。實際使用時,我們可以根據需要來傳入實際的java類型來參與程式運算。

這裡需要注意的一點:泛型不能指代八種基礎類,只能替代「引用類型」,否則編譯不通過。

java泛型除了上述這些外,還有一個特殊的泛型「<?>」,這個被稱為通配符。

改成通配符「?」也能夠正常運行:

說完通配符「?」後,咱們再來聊聊泛型的邊界範圍。

有這樣一個問題:泛型的類型佔位符可以替代各種實際類型,雖然靈活,但是有時候根據業務需要,某個方法只應該傳入某種資料類型及其子類型。為了限制傳入的類型,我們就用上了邊界。

泛型邊界分為上邊界、下邊界。上邊界限定傳入的類型的最高階父類型,下邊界限定傳入的子類的最低階子類型。

泛型上邊界的寫法舉例:「? extends Number」。「?」可以替換為其他泛型佔位符,限制的類型寫在extends後面」。如下圖,我們限定getV方法的入參KV類型的泛型上邊界是Number(入參類型必須為Number類型或Number之下的子類),則該方法可接受Number類型及其子類的參數。我們呼叫方法時傳入的泛型為Integer

泛型下邊界的寫法舉例:「? super Number」。「?」可以替換為其他泛型佔位符,限制的類型寫在super後面」。如圖,我們限定getV方法的參數KV類型的泛型下邊界是Number(入參類型必須為Number類型或Number之上的父類),則該方法可接受Number類型及其父類的參數。我們呼叫方法時傳入的泛型為Integer時,Integer類型為Number的子類型,而限定的最低類型是Number類型,入參應該比Number類型要高,或者是它本身。所以這裡會編譯不通過:

通過上兩圖的示例,相信大家應該都能夠搞懂泛型的上下邊界用法了吧?

好了,今日的教程就到這裡。

#Java語言初學#


IT145.com E-mail:sddin#qq.com