java高級特性泛型

Java語言高級

1. 使用泛型的意義

爲什麼我們需要泛型?

所以泛型的好處就是:

l 適用於多種數據類型執行相同的代碼

例如實現int類型的加法, 有時候還需要實現long類型的求和, 如果還需要double類型的求和,需要重新在重載一個輸入是double類型的add方法。

如果沒有泛型每種類型數字都要重載一個add方法,代碼量多而且沒有必要,後續維護也麻煩,如果add方法裏面增加一行代碼?那就需要修改10個方法。

l 泛型中的類型在使用時指定,不需要強制類型轉換

例如集合中不用泛型那麼默認類型Object,可以存入String,int,double,保存數據很開心,但是用的時候就是災難了。你必須強制類型轉換到具體的目標類型,且很容易出現“java.lang.ClassCastException”異常。

泛型類和泛型接口

泛型,即“參數化類型”。

參數很熟悉,自定義方法有形參,調用方法時候要傳遞實參。

顧名思義,就是將類型由原來的具體的類型參數化,類似於方法中的變量參數,此時類型也定義成參數形式(可以稱之爲類型形參),然後在使用/調用時傳入具體的類型(類型實參)。

泛型的本質是爲了參數化類型,過去參數不同輸出不同結果,類型也可以參數化,那就是不同參數類型輸出不同的結果。

也就是說在泛型使用過程中,操作的數據類型被指定爲一個參數,這種參數類型可以用在類、接口和方法中,分別被稱爲泛型類、泛型接口、泛型方法

限定類型變量

extends 上限通配符 可以接收extend後的類型及子類

super 下限通配符 可以接收super後的類型及父類

T extends Comparable中

T表示應該綁定類型的子類型,Comparable表示綁定類型,子類型和綁定類型可以是類也可以是接口。

如果這個時候,我們試圖傳入一個沒有實現接口Comparable的類的實例,將會發生編譯錯誤。


泛型類的靜態上下文中類型變量失效

泛型和static是不兼容的,

不能在靜態域或方法中引用類型變量。因**爲泛型是要在對象創建的時候才知道是什麼類型的,而對象創建的代碼執行先後順序是static的部分,然後纔是構造函數等等。所以在對象初始化之前static的部分已經執行了,如果你在靜態部分引用的泛型,那麼毫無疑問虛擬機根本不知道是什麼東西,**因爲這個時候類還沒有初始化。
類型擦除
泛型是 Java 1.5 版本才引進的概念,在這之前是沒有泛型的概念的,但顯然,泛型代碼能夠很好地和之前版本的代碼很好地兼容。

這是因爲,泛型信息只存在於代碼編譯階段,在進入 JVM 之前,與泛型相關的信息會被擦除掉,專業術語叫做類型擦除。

通俗地講,泛型類和普通類在 java 虛擬機內是沒有什麼特別的地方。
Java 泛型擦除是 Java 泛型中的一個重要特性,其目的是避免過多的創建類而造成的運行時的過度消耗。所以,想 ArrayList 和 ArrayList 這兩個實例,其類實例是同一個。

但很多情況下我們又需要在運行時獲得泛型信息,那我們可以通過定義類的方式(通常爲匿名內部類,因爲我們創建這個類只是爲了獲得泛型信息)在運行時獲得泛型參數,從而滿足例如序列化、反序列化等工作的需要。

發佈了72 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章