手撕JAVA(三十五)堆污染

堆污染是由於泛型的使用造成的一種潛在危險。

總結起來,堆污染就是因爲使用泛型參數化類內部成員變量,同一類的不同實例對象內部裏面成員變量的類型可能不同,

編譯階段無法發現,運行期間才能被發現的類型轉換錯誤問題。

以下面一圖說明泛型可能帶來的堆污染問題:

虛擬機棧將方法(method)壓棧,局部變量表中的list1會在堆空間中通過new關鍵字開闢內存空間,

並將該片內存空間的地址引用返回給list1。

但是List是個類類型,其中具體存放元素的Object數組只是這個類的成員變量。但是JAVA的引用傳遞的檢查機制是在類層面的。

也就是說用相同形狀的映射相同形狀的,形狀裏面的內容無關緊要。

所以編譯階段是不會出錯的,因爲Object類型的數組可以存放任何元素,但是在通過引用指向取出元素的時候就會報類型轉換錯誤——integer無法轉換成String。

因爲ArrayList的底層源碼裏面在指定泛型的時候已經將返回值類型替換掉。list1、list2的相同方法返回值類型一個爲integer一個爲String。

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