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