1. 程式人生 > >Array和ArrayList的Clone為什麽一個不用類型轉換,一個要類型轉換

Array和ArrayList的Clone為什麽一個不用類型轉換,一個要類型轉換

分析 original 調用 super 不用 轉換 得出 ima 分享圖片

技術分享圖片

通過上面一段代碼可以看出Array的Clone()不用進行類型轉換,但ArrayList的Clone要進行類型轉換。為什麽會出現這種情況呢?我們來分析下源碼

現在來看下Array的Clone()方法源碼

技術分享圖片

發現Array裏沒有Clone()方法,調用的都是Object裏的方法

技術分享圖片

這裏面的除了Object並不是說Object就不遵守這個慣例,而是Object就是這個慣例的源頭,它是一定遵守的,那麽就可以得出結論

Array調用Clone是不用類型轉換的。

那麽為什麽ArrayList就要呢?我們來看下ArrayList裏的Clone()方法

技術分享圖片

調用super的Clone方法,好像也沒有問題,但問題在下面一行Arrays的copyOf()方法,我在看下copyOf()方法

技術分享圖片

發現,這裏需要original的類型,那麽original的類型又是什麽呢?我們回到上面看clone(),original對應參數elementData對象,那麽elementData是什麽類型呢?

技術分享圖片

通過這個可以看出,elementData是Object類型,original也是Object類型,通過copyOf方法返回的也是一個Object對象,所以我們得出結論

ArrayList返回的是一個Object對象,該Object使系統無法識別具體類型,所以要進行類型轉換。

Array和ArrayList的Clone為什麽一個不用類型轉換,一個要類型轉換